OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 // Step 12.5.11 | 461 // Step 12.5.11 |
462 m_regionList.append(region); | 462 m_regionList.append(region); |
463 } | 463 } |
464 | 464 |
465 double VTTParser::collectTimeStamp(const String& line, unsigned* position) | 465 double VTTParser::collectTimeStamp(const String& line, unsigned* position) |
466 { | 466 { |
467 // Collect a WebVTT timestamp (5.3 WebVTT cue timings and settings parsing.) | 467 // Collect a WebVTT timestamp (5.3 WebVTT cue timings and settings parsing.) |
468 // Steps 1 - 4 - Initial checks, let most significant units be minutes. | 468 // Steps 1 - 4 - Initial checks, let most significant units be minutes. |
469 enum Mode { Minutes, Hours }; | 469 enum Mode { Minutes, Hours }; |
470 Mode mode = Minutes; | 470 Mode mode = Minutes; |
471 if (*position >= line.length() || !isASCIIDigit(line[*position])) | |
472 return malformedTime; | |
473 | 471 |
474 int value1; | |
475 // Steps 5 - 7 - Collect a sequence of characters that are 0-9. | 472 // Steps 5 - 7 - Collect a sequence of characters that are 0-9. |
476 // If not 2 characters or value is greater than 59, interpret as hours. | 473 // If not 2 characters or value is greater than 59, interpret as hours. |
477 if (collectDigitsToInt(line, position, value1) != 2 || value1 > 59) | 474 int value1; |
| 475 unsigned value1Digits = collectDigitsToInt(line, position, value1); |
| 476 if (!value1Digits) |
| 477 return malformedTime; |
| 478 if (value1Digits != 2 || value1 > 59) |
478 mode = Hours; | 479 mode = Hours; |
479 | 480 |
480 // Steps 8 - 11 - Collect the next sequence of 0-9 after ':' (must be 2 char
s). | 481 // Steps 8 - 11 - Collect the next sequence of 0-9 after ':' (must be 2 char
s). |
481 if (*position >= line.length() || line[(*position)++] != ':') | 482 if (*position >= line.length() || line[(*position)++] != ':') |
482 return malformedTime; | 483 return malformedTime; |
483 if (*position >= line.length() || !isASCIIDigit(line[(*position)])) | |
484 return malformedTime; | |
485 int value2; | 484 int value2; |
486 if (collectDigitsToInt(line, position, value2) != 2) | 485 if (collectDigitsToInt(line, position, value2) != 2) |
487 return malformedTime; | 486 return malformedTime; |
488 | 487 |
489 // Step 12 - Detect whether this timestamp includes hours. | 488 // Step 12 - Detect whether this timestamp includes hours. |
490 int value3; | 489 int value3; |
491 if (mode == Hours || (*position < line.length() && line[*position] == ':'))
{ | 490 if (mode == Hours || (*position < line.length() && line[*position] == ':'))
{ |
492 if (*position >= line.length() || line[(*position)++] != ':') | 491 if (*position >= line.length() || line[(*position)++] != ':') |
493 return malformedTime; | 492 return malformedTime; |
494 if (*position >= line.length() || !isASCIIDigit(line[*position])) | |
495 return malformedTime; | |
496 if (collectDigitsToInt(line, position, value3) != 2) | 493 if (collectDigitsToInt(line, position, value3) != 2) |
497 return malformedTime; | 494 return malformedTime; |
498 } else { | 495 } else { |
499 value3 = value2; | 496 value3 = value2; |
500 value2 = value1; | 497 value2 = value1; |
501 value1 = 0; | 498 value1 = 0; |
502 } | 499 } |
503 | 500 |
504 // Steps 13 - 17 - Collect next sequence of 0-9 after '.' (must be 3 chars). | 501 // Steps 13 - 17 - Collect next sequence of 0-9 after '.' (must be 3 chars). |
505 if (*position >= line.length() || line[(*position)++] != '.') | 502 if (*position >= line.length() || line[(*position)++] != '.') |
506 return malformedTime; | 503 return malformedTime; |
507 if (*position >= line.length() || !isASCIIDigit(line[*position])) | |
508 return malformedTime; | |
509 int value4; | 504 int value4; |
510 if (collectDigitsToInt(line, position, value4) != 3) | 505 if (collectDigitsToInt(line, position, value4) != 3) |
511 return malformedTime; | 506 return malformedTime; |
512 if (value2 > 59 || value3 > 59) | 507 if (value2 > 59 || value3 > 59) |
513 return malformedTime; | 508 return malformedTime; |
514 | 509 |
515 // Steps 18 - 19 - Calculate result. | 510 // Steps 18 - 19 - Calculate result. |
516 return (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + (v
alue4 * secondsPerMillisecond); | 511 return (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + (v
alue4 * secondsPerMillisecond); |
517 } | 512 } |
518 | 513 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 m_currentNode->parserAppendChild(ProcessingInstruction::create(docum
ent, "timestamp", charactersString)); | 611 m_currentNode->parserAppendChild(ProcessingInstruction::create(docum
ent, "timestamp", charactersString)); |
617 break; | 612 break; |
618 } | 613 } |
619 default: | 614 default: |
620 break; | 615 break; |
621 } | 616 } |
622 } | 617 } |
623 | 618 |
624 } | 619 } |
625 | 620 |
OLD | NEW |