nsresult
nsSceneTracker::ParseSceneNumber(nsString sceneNumber,
                                 PRUint32* ioNumberLength,
                                 PRUint32* outNumber) {
  NS_ENSURE_ARG_POINTER(ioNumberLength);
  NS_ENSURE_ARG_POINTER(outNumber);
  NS_ENSURE_ARG_MIN(*ioNumberLength, 1);

  NS_LossyConvertUTF16toASCII asciiSceneNumber(sceneNumber);
  const char* cursor = asciiSceneNumber.get();
  PRUint32 scanned = 0;
  PRUint32 number;
  int read = 0;

  // %n is not counted in the return value, but we can detect it
  // if we reset 'read' before each call, because read will not
  // be set if it fails to parse a period after the number
  while (sscanf(cursor, "%u.%n", &number, &read) > 0) {
    outNumber[scanned++] = number;
    if (read == 0 || scanned == *ioNumberLength)
      break;
    cursor += read;
    read = 0;
  }

  *ioNumberLength = scanned;

  if (scanned == 0)
    return NS_ERROR_FAILURE;
  else
    return NS_OK;
}
nsresult
nsSceneTracker::SceneNumberBetweenScenes (
                                      nsIDOMHTMLParagraphElement* aLeftScene,
                                      nsIDOMHTMLParagraphElement* aRightScene,
                                      PRUint32* ioNumberLength,
                                      PRUint32* outNumber,
                                      PRBool* outPropagateChanges) {
  NS_ENSURE_ARG_POINTER(ioNumberLength);
  NS_ENSURE_ARG_POINTER(outNumber);
  NS_ENSURE_ARG_POINTER(outPropagateChanges);
  NS_ENSURE_ARG_MIN(*ioNumberLength, 1);

  nsresult rv;

  nsAutoString leftNumberStr;
  PRUint32 leftNumber[DEFAULT_MAX_SCENE_DEPTH];
  PRUint32 leftNumberLength = DEFAULT_MAX_SCENE_DEPTH;

  nsAutoString rightNumberStr;
  PRUint32 rightNumber[DEFAULT_MAX_SCENE_DEPTH];
  PRUint32 rightNumberLength = DEFAULT_MAX_SCENE_DEPTH;

  NS_NAMED_LITERAL_STRING(kNumberAttr, "scenenumber");

  if (aLeftScene) {
    rv = aLeftScene->GetAttribute(kNumberAttr, leftNumberStr);
    if (NS_FAILED(rv))
      return rv;

    rv = ParseSceneNumber(leftNumberStr, &leftNumberLength, leftNumber);
    if (NS_FAILED(rv))
      return rv;
  }

  // Skip unlocked scenes, since we are allowed to renumber them anyway
  nsCOMPtr<nsIDOMHTMLParagraphElement> nextScene(aRightScene);
  while (nextScene && ! SceneHasLockedNumber(nextScene)) {
    nsCOMPtr<nsIDOMHTMLParagraphElement> tmp(nextScene);
    rv = GetNextNumberedScene(tmp, getter_AddRefs(nextScene));
    if (NS_FAILED(rv))
      return rv;
  }

  if (nextScene) {
    rv = nextScene->GetAttribute(kNumberAttr, rightNumberStr);
    if (NS_FAILED(rv))
      return rv;

    rv = ParseSceneNumber(rightNumberStr, &rightNumberLength, rightNumber);
    if (NS_FAILED(rv))
      return rv;
  }

  rv = mNumberSvc->NumberBetweenNumbers(
    aLeftScene ? leftNumber : nsnull, leftNumberLength,
    nextScene ? rightNumber : nsnull, rightNumberLength,
    outNumber, ioNumberLength, outPropagateChanges);

  return rv;
}
示例#3
0
NS_IMETHODIMP
nsCommandLine::GetArgument(int32_t aIndex, nsAString& aResult)
{
  NS_ENSURE_ARG_MIN(aIndex, 0);
  NS_ENSURE_ARG_MAX(aIndex, int32_t(mArgs.Length() - 1));

  aResult = mArgs[aIndex];
  return NS_OK;
}
示例#4
0
NS_IMETHODIMP
nsCommandLine::RemoveArguments(int32_t aStart, int32_t aEnd)
{
  NS_ENSURE_ARG_MIN(aStart, 0);
  NS_ENSURE_ARG_MAX(uint32_t(aEnd) + 1, mArgs.Length());

  for (int32_t i = aEnd; i >= aStart; --i) {
    mArgs.RemoveElementAt(i);
  }

  return NS_OK;
}