bool nsMediaFragmentURIParser::ParseNPTSec(nsDependentSubstring& aString, double& aSec)
{
  nsDependentSubstring original(aString);
  if (aString.Length() == 0) {
    return PR_FALSE;
  }

  PRUint32 index = FirstNonDigit(aString, 0);
  if (index == 0) {
    return PR_FALSE;
  }

  nsDependentSubstring n(aString, 0, index);
  PRInt32 ec;
  PRInt32 s = PromiseFlatString(n).ToInteger(&ec);
  if (NS_FAILED(ec)) {
    return PR_FALSE;
  }

  aString.Rebind(aString, index);
  double fraction = 0.0;
  if (!ParseNPTFraction(aString, fraction)) {
    aString.Rebind(original, 0);
    return PR_FALSE;
  }

  aSec = s + fraction;
  return PR_TRUE;
}
bool nsMediaFragmentURIParser::ParseNPTSec(nsDependentSubstring& aString, double& aSec)
{
  nsDependentSubstring original(aString);
  if (aString.Length() == 0) {
    return false;
  }

  uint32_t index = FirstNonDigit(aString, 0);
  if (index == 0) {
    return false;
  }

  nsDependentSubstring n(aString, 0, index);
  nsresult ec;
  int32_t s = PromiseFlatString(n).ToInteger(&ec);
  if (NS_FAILED(ec)) {
    return false;
  }

  aString.Rebind(aString, index);
  double fraction = 0.0;
  if (!ParseNPTFraction(aString, fraction)) {
    aString.Rebind(original, 0);
    return false;
  }

  aSec = s + fraction;
  return true;
}
static bool ParseInteger(nsDependentSubstring& aString,
                         int32_t& aResult)
{
  uint32_t index = FirstNonDigit(aString, 0);
  if (index == 0) {
    return false;
  }

  nsDependentSubstring n(aString, 0, index);
  nsresult ec;
  int32_t s = PromiseFlatString(n).ToInteger(&ec);
  if (NS_FAILED(ec)) {
    return false;
  }

  aString.Rebind(aString, index);
  aResult = s;
  return true;
}
bool nsMediaFragmentURIParser::ParseNPTFraction(nsDependentSubstring& aString, double& aFraction)
{
  double fraction = 0.0;

  if (aString.Length() > 0 && aString[0] == '.') {
    PRUint32 index = FirstNonDigit(aString, 1);

    if (index > 1) {
      nsDependentSubstring number(aString, 0, index);
      PRInt32 ec;
      fraction = PromiseFlatString(number).ToDouble(&ec);
      if (NS_FAILED(ec)) {
        return PR_FALSE;
      }
    }
    aString.Rebind(aString, index);
  }

  aFraction = fraction;
  return PR_TRUE;
}
bool nsMediaFragmentURIParser::ParseNPTHH(nsDependentSubstring& aString, PRUint32& aHour)
{
  if (aString.Length() == 0) {
    return PR_FALSE;
  }

  PRUint32 index = FirstNonDigit(aString, 0);
  if (index == 0) {
    return PR_FALSE;
  }

  nsDependentSubstring n(aString, 0, index);
  PRInt32 ec;
  PRInt32 u = PromiseFlatString(n).ToInteger(&ec);
  if (NS_FAILED(ec)) {
    return PR_FALSE;
  }

  aString.Rebind(aString, index);
  aHour = u;
  return PR_TRUE;
}
bool nsMediaFragmentURIParser::ParseNPTHH(nsDependentSubstring& aString, uint32_t& aHour)
{
  if (aString.Length() == 0) {
    return false;
  }

  uint32_t index = FirstNonDigit(aString, 0);
  if (index == 0) {
    return false;
  }

  nsDependentSubstring n(aString, 0, index);
  nsresult ec;
  int32_t u = PromiseFlatString(n).ToInteger(&ec);
  if (NS_FAILED(ec)) {
    return false;
  }

  aString.Rebind(aString, index);
  aHour = u;
  return true;
}