1/** 2 * Copyright 2014 Paul Querna 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 */ 17 18package v1 19 20import ( 21 "fmt" 22 "io" 23 "unicode" 24 "unicode/utf16" 25) 26 27const sliceStringMask = cIJC | cNFP 28 29type ffReader struct { 30 s []byte 31 i int 32 l int 33} 34 35func newffReader(d []byte) *ffReader { 36 return &ffReader{ 37 s: d, 38 i: 0, 39 l: len(d), 40 } 41} 42 43func (r *ffReader) Pos() int { 44 return r.i 45} 46 47// Reset the reader, and add new input. 48func (r *ffReader) Reset(d []byte) { 49 r.s = d 50 r.i = 0 51 r.l = len(d) 52} 53 54// Calcuates the Position with line and line offset, 55// because this isn't counted for performance reasons, 56// it will iterate the buffer from the beginning, and should 57// only be used in error-paths. 58func (r *ffReader) PosWithLine() (int, int) { 59 currentLine := 1 60 currentChar := 0 61 62 for i := 0; i < r.i; i++ { 63 c := r.s[i] 64 currentChar++ 65 if c == '\n' { 66 currentLine++ 67 currentChar = 0 68 } 69 } 70 71 return currentLine, currentChar 72} 73 74func (r *ffReader) ReadByteNoWS() (byte, error) { 75 if r.i >= r.l { 76 return 0, io.EOF 77 } 78 79 j := r.i 80 81 for { 82 c := r.s[j] 83 j++ 84 85 // inline whitespace parsing gives another ~8% performance boost 86 // for many kinds of nicely indented JSON. 87 // ... and using a [255]bool instead of multiple ifs, gives another 2% 88 /* 89 if c != '\t' && 90 c != '\n' && 91 c != '\v' && 92 c != '\f' && 93 c != '\r' && 94 c != ' ' { 95 r.i = j 96 return c, nil 97 } 98 */ 99 if whitespaceLookupTable[c] == false { 100 r.i = j 101 return c, nil 102 } 103 104 if j >= r.l { 105 return 0, io.EOF 106 } 107 } 108} 109 110func (r *ffReader) ReadByte() (byte, error) { 111 if r.i >= r.l { 112 return 0, io.EOF 113 } 114 115 r.i++ 116 117 return r.s[r.i-1], nil 118} 119 120func (r *ffReader) UnreadByte() { 121 if r.i <= 0 { 122 panic("ffReader.UnreadByte: at beginning of slice") 123 } 124 r.i-- 125} 126 127func (r *ffReader) readU4(j int) (rune, error) { 128 129 var u4 [4]byte 130 for i := 0; i < 4; i++ { 131 if j >= r.l { 132 return -1, io.EOF 133 } 134 c := r.s[j] 135 if byteLookupTable[c]&cVHC != 0 { 136 u4[i] = c 137 j++ 138 continue 139 } else { 140 // TODO(pquerna): handle errors better. layering violation. 141 return -1, fmt.Errorf("lex_string_invalid_hex_char: %v %v", c, string(u4[:])) 142 } 143 } 144 145 // TODO(pquerna): utf16.IsSurrogate 146 rr, err := ParseUint(u4[:], 16, 64) 147 if err != nil { 148 return -1, err 149 } 150 return rune(rr), nil 151} 152 153func (r *ffReader) handleEscaped(c byte, j int, out DecodingBuffer) (int, error) { 154 if j >= r.l { 155 return 0, io.EOF 156 } 157 158 c = r.s[j] 159 j++ 160 161 if c == 'u' { 162 ru, err := r.readU4(j) 163 if err != nil { 164 return 0, err 165 } 166 167 if utf16.IsSurrogate(ru) { 168 ru2, err := r.readU4(j + 6) 169 if err != nil { 170 return 0, err 171 } 172 out.Write(r.s[r.i : j-2]) 173 r.i = j + 10 174 j = r.i 175 rval := utf16.DecodeRune(ru, ru2) 176 if rval != unicode.ReplacementChar { 177 out.WriteRune(rval) 178 } else { 179 return 0, fmt.Errorf("lex_string_invalid_unicode_surrogate: %v %v", ru, ru2) 180 } 181 } else { 182 out.Write(r.s[r.i : j-2]) 183 r.i = j + 4 184 j = r.i 185 out.WriteRune(ru) 186 } 187 return j, nil 188 } else if byteLookupTable[c]&cVEC == 0 { 189 return 0, fmt.Errorf("lex_string_invalid_escaped_char: %v", c) 190 } else { 191 out.Write(r.s[r.i : j-2]) 192 r.i = j 193 j = r.i 194 195 switch c { 196 case '"': 197 out.WriteByte('"') 198 case '\\': 199 out.WriteByte('\\') 200 case '/': 201 out.WriteByte('/') 202 case 'b': 203 out.WriteByte('\b') 204 case 'f': 205 out.WriteByte('\f') 206 case 'n': 207 out.WriteByte('\n') 208 case 'r': 209 out.WriteByte('\r') 210 case 't': 211 out.WriteByte('\t') 212 } 213 } 214 215 return j, nil 216} 217 218func (r *ffReader) SliceString(out DecodingBuffer) error { 219 var c byte 220 // TODO(pquerna): string_with_escapes? de-escape here? 221 j := r.i 222 223 for { 224 if j >= r.l { 225 return io.EOF 226 } 227 228 j, c = scanString(r.s, j) 229 230 if c == '"' { 231 if j != r.i { 232 out.Write(r.s[r.i : j-1]) 233 r.i = j 234 } 235 return nil 236 } else if c == '\\' { 237 var err error 238 j, err = r.handleEscaped(c, j, out) 239 if err != nil { 240 return err 241 } 242 } else if byteLookupTable[c]&cIJC != 0 { 243 return fmt.Errorf("lex_string_invalid_json_char: %v", c) 244 } 245 continue 246 } 247 248 panic("ffjson: SliceString unreached exit") 249} 250 251// TODO(pquerna): consider combining wibth the normal byte mask. 252var whitespaceLookupTable [256]bool = [256]bool{ 253 false, /* 0 */ 254 false, /* 1 */ 255 false, /* 2 */ 256 false, /* 3 */ 257 false, /* 4 */ 258 false, /* 5 */ 259 false, /* 6 */ 260 false, /* 7 */ 261 false, /* 8 */ 262 true, /* 9 */ 263 true, /* 10 */ 264 true, /* 11 */ 265 true, /* 12 */ 266 true, /* 13 */ 267 false, /* 14 */ 268 false, /* 15 */ 269 false, /* 16 */ 270 false, /* 17 */ 271 false, /* 18 */ 272 false, /* 19 */ 273 false, /* 20 */ 274 false, /* 21 */ 275 false, /* 22 */ 276 false, /* 23 */ 277 false, /* 24 */ 278 false, /* 25 */ 279 false, /* 26 */ 280 false, /* 27 */ 281 false, /* 28 */ 282 false, /* 29 */ 283 false, /* 30 */ 284 false, /* 31 */ 285 true, /* 32 */ 286 false, /* 33 */ 287 false, /* 34 */ 288 false, /* 35 */ 289 false, /* 36 */ 290 false, /* 37 */ 291 false, /* 38 */ 292 false, /* 39 */ 293 false, /* 40 */ 294 false, /* 41 */ 295 false, /* 42 */ 296 false, /* 43 */ 297 false, /* 44 */ 298 false, /* 45 */ 299 false, /* 46 */ 300 false, /* 47 */ 301 false, /* 48 */ 302 false, /* 49 */ 303 false, /* 50 */ 304 false, /* 51 */ 305 false, /* 52 */ 306 false, /* 53 */ 307 false, /* 54 */ 308 false, /* 55 */ 309 false, /* 56 */ 310 false, /* 57 */ 311 false, /* 58 */ 312 false, /* 59 */ 313 false, /* 60 */ 314 false, /* 61 */ 315 false, /* 62 */ 316 false, /* 63 */ 317 false, /* 64 */ 318 false, /* 65 */ 319 false, /* 66 */ 320 false, /* 67 */ 321 false, /* 68 */ 322 false, /* 69 */ 323 false, /* 70 */ 324 false, /* 71 */ 325 false, /* 72 */ 326 false, /* 73 */ 327 false, /* 74 */ 328 false, /* 75 */ 329 false, /* 76 */ 330 false, /* 77 */ 331 false, /* 78 */ 332 false, /* 79 */ 333 false, /* 80 */ 334 false, /* 81 */ 335 false, /* 82 */ 336 false, /* 83 */ 337 false, /* 84 */ 338 false, /* 85 */ 339 false, /* 86 */ 340 false, /* 87 */ 341 false, /* 88 */ 342 false, /* 89 */ 343 false, /* 90 */ 344 false, /* 91 */ 345 false, /* 92 */ 346 false, /* 93 */ 347 false, /* 94 */ 348 false, /* 95 */ 349 false, /* 96 */ 350 false, /* 97 */ 351 false, /* 98 */ 352 false, /* 99 */ 353 false, /* 100 */ 354 false, /* 101 */ 355 false, /* 102 */ 356 false, /* 103 */ 357 false, /* 104 */ 358 false, /* 105 */ 359 false, /* 106 */ 360 false, /* 107 */ 361 false, /* 108 */ 362 false, /* 109 */ 363 false, /* 110 */ 364 false, /* 111 */ 365 false, /* 112 */ 366 false, /* 113 */ 367 false, /* 114 */ 368 false, /* 115 */ 369 false, /* 116 */ 370 false, /* 117 */ 371 false, /* 118 */ 372 false, /* 119 */ 373 false, /* 120 */ 374 false, /* 121 */ 375 false, /* 122 */ 376 false, /* 123 */ 377 false, /* 124 */ 378 false, /* 125 */ 379 false, /* 126 */ 380 false, /* 127 */ 381 false, /* 128 */ 382 false, /* 129 */ 383 false, /* 130 */ 384 false, /* 131 */ 385 false, /* 132 */ 386 false, /* 133 */ 387 false, /* 134 */ 388 false, /* 135 */ 389 false, /* 136 */ 390 false, /* 137 */ 391 false, /* 138 */ 392 false, /* 139 */ 393 false, /* 140 */ 394 false, /* 141 */ 395 false, /* 142 */ 396 false, /* 143 */ 397 false, /* 144 */ 398 false, /* 145 */ 399 false, /* 146 */ 400 false, /* 147 */ 401 false, /* 148 */ 402 false, /* 149 */ 403 false, /* 150 */ 404 false, /* 151 */ 405 false, /* 152 */ 406 false, /* 153 */ 407 false, /* 154 */ 408 false, /* 155 */ 409 false, /* 156 */ 410 false, /* 157 */ 411 false, /* 158 */ 412 false, /* 159 */ 413 false, /* 160 */ 414 false, /* 161 */ 415 false, /* 162 */ 416 false, /* 163 */ 417 false, /* 164 */ 418 false, /* 165 */ 419 false, /* 166 */ 420 false, /* 167 */ 421 false, /* 168 */ 422 false, /* 169 */ 423 false, /* 170 */ 424 false, /* 171 */ 425 false, /* 172 */ 426 false, /* 173 */ 427 false, /* 174 */ 428 false, /* 175 */ 429 false, /* 176 */ 430 false, /* 177 */ 431 false, /* 178 */ 432 false, /* 179 */ 433 false, /* 180 */ 434 false, /* 181 */ 435 false, /* 182 */ 436 false, /* 183 */ 437 false, /* 184 */ 438 false, /* 185 */ 439 false, /* 186 */ 440 false, /* 187 */ 441 false, /* 188 */ 442 false, /* 189 */ 443 false, /* 190 */ 444 false, /* 191 */ 445 false, /* 192 */ 446 false, /* 193 */ 447 false, /* 194 */ 448 false, /* 195 */ 449 false, /* 196 */ 450 false, /* 197 */ 451 false, /* 198 */ 452 false, /* 199 */ 453 false, /* 200 */ 454 false, /* 201 */ 455 false, /* 202 */ 456 false, /* 203 */ 457 false, /* 204 */ 458 false, /* 205 */ 459 false, /* 206 */ 460 false, /* 207 */ 461 false, /* 208 */ 462 false, /* 209 */ 463 false, /* 210 */ 464 false, /* 211 */ 465 false, /* 212 */ 466 false, /* 213 */ 467 false, /* 214 */ 468 false, /* 215 */ 469 false, /* 216 */ 470 false, /* 217 */ 471 false, /* 218 */ 472 false, /* 219 */ 473 false, /* 220 */ 474 false, /* 221 */ 475 false, /* 222 */ 476 false, /* 223 */ 477 false, /* 224 */ 478 false, /* 225 */ 479 false, /* 226 */ 480 false, /* 227 */ 481 false, /* 228 */ 482 false, /* 229 */ 483 false, /* 230 */ 484 false, /* 231 */ 485 false, /* 232 */ 486 false, /* 233 */ 487 false, /* 234 */ 488 false, /* 235 */ 489 false, /* 236 */ 490 false, /* 237 */ 491 false, /* 238 */ 492 false, /* 239 */ 493 false, /* 240 */ 494 false, /* 241 */ 495 false, /* 242 */ 496 false, /* 243 */ 497 false, /* 244 */ 498 false, /* 245 */ 499 false, /* 246 */ 500 false, /* 247 */ 501 false, /* 248 */ 502 false, /* 249 */ 503 false, /* 250 */ 504 false, /* 251 */ 505 false, /* 252 */ 506 false, /* 253 */ 507 false, /* 254 */ 508 false, /* 255 */ 509} 510