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; }
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; }
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; }