mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-29 10:08:38 +00:00
16aec83f00
- Bug 1175600. Add getRelativePath/setRelativePath to nsIFile. r=froydnj (93515cbda)
- bug 1171124 - Swap some XP_MACOSX for XP_DARWIN in nsLocalFileUnix. r=froydnj (1928918ac)
- Bug 1192230 - clean up reference-counting in xpcom/; r=erahm (11528cd9f)
- missing bit of Bug 1138293 - Use malloc/free/realloc/calloc (365fb9991)
- Bug 1175601. Make nsIFile.getRelativeDescriptor work with paths with aths with arbitrary numbers of segments, not just 32. r=froydnj (a4b5ea11d)
- Bug 1175600 followup. Add getRelativePath to ye othere nsIFile implementatione so as to de-bust ye olde CLOSED TREE (b23dfee9e)
- Bug 1159604 - Use fallible allocations in nsLinebreakConverter.cpp (as the code expects). r=smaug (498f30023)
- Bug 1139547 - Fix unsequenced variable modmification/access error. r=botond,bsmedberg (a8460ecff)
- Bug 1167380 - Mark (Read/Write)SegmentsState::m(Source/Sink) as MOZ_NON_OWNING_REF and mark as MOZ_STACK_CLASS. r=froydnj (a1f2dc2ae)
- Bug 1137464 - add missing include for nsICloneableInputStream.h to nsStreamUtils.cpp; r=bkelly (dddd1831c)
- Bug 1026761 - CID 749761: nsAStreamCopier::Process can use sourceCondition, sinkCondition uninitialized. r=froydnj (a728f2b3e)
- Bug 1189423 - part 1 - Add MOZ_COUNT_CTOR/DTOR for nsXPTCStubBase. r=froydnj (208b578bb)
- Bug 1189423 - part 2 - Remove superfluous |new| result check. r=froydnj (b58d8b1fd)
- Bug 1151506 - Null-check the count parameter in GetConstantCount. r=froydnj (6e89f6635)
- Bug 1171603 - Better size check in nsTSubstring::ReplacePrep. r=ehsan (f17bb9c07)
- Bug 603201 - Enable primitive receivers in [[Get]]. r=jorendorff (24e6b04e2)
- revert/align malloc functions to bug 1156317 21 April 2015 (89de8cbad)
- Bug 1081260 - Update the malloc counters if we successfully recover from OOM; r=jonco (c3a03f041)
- Bug 1196210 - Fix an incomplete assertion in the nursery; r=jonco (84140599a)
- Bug 1198826 - Increment (plain) gcNumber on all GCs, r=terrence (a45b9d65c)
- Bug 1184578 - Fix the nursery profiling print statement; r=sfink (f03accbe4)
- Bug 1188878 - Ensure RematerializedFrames are cleared from Debugger instances on Ion bailout failure. (r=jandem) (0cad2e549)
- pointer style (96793b3b3)
- some leftover (7685205e9)
- pointer style (5dc480bd4)
- Bug 1145781 - Unlazify functions when getting their debug scopes. (r=jimb) (f86c2a1b6)
- Bug 1148388 - Handle lost accesses in missing Debugger scopes for block objects. (r=jimb) (9c1734834)
- Bug 1118865 - Relax assertion in DebugScopeProxy::isMagicMissingArgumentsValue. (r=nbp) (7b46b3929)
- Bug 1193046 - Clear prevUpToDate on younger frames when toggling frame debuggeeness off->on. (r=jimb) (f93459582)
- Bug 1188334 - Fix this one weird case with creating debug block scopes of 0-variable block scopes that come from deprecated let exprs inside generators. (r=jimb) (69cc9afe9)
- code style (dc626020e)
- Bug 1135703 - Ensure that lastProfilingFrame gets set appropriately on ALL JitActivations when profiling is turned on or off. r=shu (64665fe96)
- missing init, taken from TFF (dc9544999)
- pointer style (84478dba2)
- cleanup (6e2dd6ae3)
- reposition due to misspatch (738769d65)
- Bug 1191758 - Rework JS::FormatStackDump() to fix OOM handling r=terrence (680e5f8d2)
- Bug 1195545 - Add instruction reordering pass to IonMonkey, r=sunfish. (ba1441975)
487 lines
13 KiB
C++
487 lines
13 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "nsLinebreakConverter.h"
|
|
|
|
#include "nsMemory.h"
|
|
#include "nsCRT.h"
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
GetLinebreakString
|
|
|
|
Could make this inline
|
|
----------------------------------------------------------------------------*/
|
|
static const char*
|
|
GetLinebreakString(nsLinebreakConverter::ELinebreakType aBreakType)
|
|
{
|
|
static const char* const sLinebreaks[] = {
|
|
"", // any
|
|
NS_LINEBREAK, // platform
|
|
LFSTR, // content
|
|
CRLF, // net
|
|
CRSTR, // Mac
|
|
LFSTR, // Unix
|
|
CRLF, // Windows
|
|
" ", // space
|
|
nullptr
|
|
};
|
|
|
|
return sLinebreaks[aBreakType];
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
AppendLinebreak
|
|
|
|
Wee inline method to append a line break. Modifies ioDest.
|
|
----------------------------------------------------------------------------*/
|
|
template<class T>
|
|
void
|
|
AppendLinebreak(T*& aIoDest, const char* aLineBreakStr)
|
|
{
|
|
*aIoDest++ = *aLineBreakStr;
|
|
|
|
if (aLineBreakStr[1]) {
|
|
*aIoDest++ = aLineBreakStr[1];
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CountChars
|
|
|
|
Counts occurrences of breakStr in aSrc
|
|
----------------------------------------------------------------------------*/
|
|
template<class T>
|
|
int32_t
|
|
CountLinebreaks(const T* aSrc, int32_t aInLen, const char* aBreakStr)
|
|
{
|
|
const T* src = aSrc;
|
|
const T* srcEnd = aSrc + aInLen;
|
|
int32_t theCount = 0;
|
|
|
|
while (src < srcEnd) {
|
|
if (*src == *aBreakStr) {
|
|
src++;
|
|
|
|
if (aBreakStr[1]) {
|
|
if (src < srcEnd && *src == aBreakStr[1]) {
|
|
src++;
|
|
theCount++;
|
|
}
|
|
} else {
|
|
theCount++;
|
|
}
|
|
} else {
|
|
src++;
|
|
}
|
|
}
|
|
|
|
return theCount;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
ConvertBreaks
|
|
|
|
ioLen *includes* a terminating null, if any
|
|
----------------------------------------------------------------------------*/
|
|
template<class T>
|
|
static T*
|
|
ConvertBreaks(const T* aInSrc, int32_t& aIoLen, const char* aSrcBreak,
|
|
const char* aDestBreak)
|
|
{
|
|
NS_ASSERTION(aInSrc && aSrcBreak && aDestBreak, "Got a null string");
|
|
|
|
T* resultString = nullptr;
|
|
|
|
// handle the no conversion case
|
|
if (nsCRT::strcmp(aSrcBreak, aDestBreak) == 0) {
|
|
resultString = (T*)malloc(sizeof(T) * aIoLen);
|
|
if (!resultString) {
|
|
return nullptr;
|
|
}
|
|
memcpy(resultString, aInSrc, sizeof(T) * aIoLen); // includes the null, if any
|
|
return resultString;
|
|
}
|
|
|
|
int32_t srcBreakLen = strlen(aSrcBreak);
|
|
int32_t destBreakLen = strlen(aDestBreak);
|
|
|
|
// handle the easy case, where the string length does not change, and the
|
|
// breaks are only 1 char long, i.e. CR <-> LF
|
|
if (srcBreakLen == destBreakLen && srcBreakLen == 1) {
|
|
resultString = (T*)malloc(sizeof(T) * aIoLen);
|
|
if (!resultString) {
|
|
return nullptr;
|
|
}
|
|
|
|
const T* src = aInSrc;
|
|
const T* srcEnd = aInSrc + aIoLen; // includes null, if any
|
|
T* dst = resultString;
|
|
|
|
char srcBreakChar = *aSrcBreak; // we know it's one char long already
|
|
char dstBreakChar = *aDestBreak;
|
|
|
|
while (src < srcEnd) {
|
|
if (*src == srcBreakChar) {
|
|
*dst++ = dstBreakChar;
|
|
src++;
|
|
} else {
|
|
*dst++ = *src++;
|
|
}
|
|
}
|
|
|
|
// aIoLen does not change
|
|
} else {
|
|
// src and dest termination is different length. Do it a slower way.
|
|
|
|
// count linebreaks in src. Assumes that chars in 2-char linebreaks are unique.
|
|
int32_t numLinebreaks = CountLinebreaks(aInSrc, aIoLen, aSrcBreak);
|
|
|
|
int32_t newBufLen =
|
|
aIoLen - (numLinebreaks * srcBreakLen) + (numLinebreaks * destBreakLen);
|
|
resultString = (T*)malloc(sizeof(T) * newBufLen);
|
|
if (!resultString) {
|
|
return nullptr;
|
|
}
|
|
|
|
const T* src = aInSrc;
|
|
const T* srcEnd = aInSrc + aIoLen; // includes null, if any
|
|
T* dst = resultString;
|
|
|
|
while (src < srcEnd) {
|
|
if (*src == *aSrcBreak) {
|
|
*dst++ = *aDestBreak;
|
|
if (aDestBreak[1]) {
|
|
*dst++ = aDestBreak[1];
|
|
}
|
|
|
|
src++;
|
|
if (src < srcEnd && aSrcBreak[1] && *src == aSrcBreak[1]) {
|
|
src++;
|
|
}
|
|
} else {
|
|
*dst++ = *src++;
|
|
}
|
|
}
|
|
|
|
aIoLen = newBufLen;
|
|
}
|
|
|
|
return resultString;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
ConvertBreaksInSitu
|
|
|
|
Convert breaks in situ. Can only do this if the linebreak length
|
|
does not change.
|
|
----------------------------------------------------------------------------*/
|
|
template<class T>
|
|
static void
|
|
ConvertBreaksInSitu(T* aInSrc, int32_t aInLen, char aSrcBreak, char aDestBreak)
|
|
{
|
|
T* src = aInSrc;
|
|
T* srcEnd = aInSrc + aInLen;
|
|
|
|
while (src < srcEnd) {
|
|
if (*src == aSrcBreak) {
|
|
*src = aDestBreak;
|
|
}
|
|
|
|
src++;
|
|
}
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
ConvertUnknownBreaks
|
|
|
|
Convert unknown line breaks to the specified break.
|
|
|
|
This will convert CRLF pairs to one break, and single CR or LF to a break.
|
|
----------------------------------------------------------------------------*/
|
|
template<class T>
|
|
static T*
|
|
ConvertUnknownBreaks(const T* aInSrc, int32_t& aIoLen, const char* aDestBreak)
|
|
{
|
|
const T* src = aInSrc;
|
|
const T* srcEnd = aInSrc + aIoLen; // includes null, if any
|
|
|
|
int32_t destBreakLen = strlen(aDestBreak);
|
|
int32_t finalLen = 0;
|
|
|
|
while (src < srcEnd) {
|
|
if (*src == nsCRT::CR) {
|
|
if (src < srcEnd && src[1] == nsCRT::LF) {
|
|
// CRLF
|
|
finalLen += destBreakLen;
|
|
src++;
|
|
} else {
|
|
// Lone CR
|
|
finalLen += destBreakLen;
|
|
}
|
|
} else if (*src == nsCRT::LF) {
|
|
// Lone LF
|
|
finalLen += destBreakLen;
|
|
} else {
|
|
finalLen++;
|
|
}
|
|
src++;
|
|
}
|
|
|
|
T* resultString = (T*)malloc(sizeof(T) * finalLen);
|
|
if (!resultString) {
|
|
return nullptr;
|
|
}
|
|
|
|
src = aInSrc;
|
|
srcEnd = aInSrc + aIoLen; // includes null, if any
|
|
|
|
T* dst = resultString;
|
|
|
|
while (src < srcEnd) {
|
|
if (*src == nsCRT::CR) {
|
|
if (src < srcEnd && src[1] == nsCRT::LF) {
|
|
// CRLF
|
|
AppendLinebreak(dst, aDestBreak);
|
|
src++;
|
|
} else {
|
|
// Lone CR
|
|
AppendLinebreak(dst, aDestBreak);
|
|
}
|
|
} else if (*src == nsCRT::LF) {
|
|
// Lone LF
|
|
AppendLinebreak(dst, aDestBreak);
|
|
} else {
|
|
*dst++ = *src;
|
|
}
|
|
src++;
|
|
}
|
|
|
|
aIoLen = finalLen;
|
|
return resultString;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
ConvertLineBreaks
|
|
|
|
----------------------------------------------------------------------------*/
|
|
char*
|
|
nsLinebreakConverter::ConvertLineBreaks(const char* aSrc,
|
|
ELinebreakType aSrcBreaks,
|
|
ELinebreakType aDestBreaks,
|
|
int32_t aSrcLen, int32_t* aOutLen)
|
|
{
|
|
NS_ASSERTION(aDestBreaks != eLinebreakAny &&
|
|
aSrcBreaks != eLinebreakSpace, "Invalid parameter");
|
|
if (!aSrc) {
|
|
return nullptr;
|
|
}
|
|
|
|
int32_t sourceLen = (aSrcLen == kIgnoreLen) ? strlen(aSrc) + 1 : aSrcLen;
|
|
|
|
char* resultString;
|
|
if (aSrcBreaks == eLinebreakAny) {
|
|
resultString = ConvertUnknownBreaks(aSrc, sourceLen,
|
|
GetLinebreakString(aDestBreaks));
|
|
} else
|
|
resultString = ConvertBreaks(aSrc, sourceLen,
|
|
GetLinebreakString(aSrcBreaks),
|
|
GetLinebreakString(aDestBreaks));
|
|
|
|
if (aOutLen) {
|
|
*aOutLen = sourceLen;
|
|
}
|
|
return resultString;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
ConvertLineBreaksInSitu
|
|
|
|
----------------------------------------------------------------------------*/
|
|
nsresult
|
|
nsLinebreakConverter::ConvertLineBreaksInSitu(char** aIoBuffer,
|
|
ELinebreakType aSrcBreaks,
|
|
ELinebreakType aDestBreaks,
|
|
int32_t aSrcLen, int32_t* aOutLen)
|
|
{
|
|
NS_ASSERTION(aIoBuffer && *aIoBuffer, "Null pointer passed");
|
|
if (!aIoBuffer || !*aIoBuffer) {
|
|
return NS_ERROR_NULL_POINTER;
|
|
}
|
|
|
|
NS_ASSERTION(aDestBreaks != eLinebreakAny &&
|
|
aSrcBreaks != eLinebreakSpace, "Invalid parameter");
|
|
|
|
int32_t sourceLen = (aSrcLen == kIgnoreLen) ? strlen(*aIoBuffer) + 1 : aSrcLen;
|
|
|
|
// can we convert in-place?
|
|
const char* srcBreaks = GetLinebreakString(aSrcBreaks);
|
|
const char* dstBreaks = GetLinebreakString(aDestBreaks);
|
|
|
|
if (aSrcBreaks != eLinebreakAny &&
|
|
strlen(srcBreaks) == 1 &&
|
|
strlen(dstBreaks) == 1) {
|
|
ConvertBreaksInSitu(*aIoBuffer, sourceLen, *srcBreaks, *dstBreaks);
|
|
if (aOutLen) {
|
|
*aOutLen = sourceLen;
|
|
}
|
|
} else {
|
|
char* destBuffer;
|
|
|
|
if (aSrcBreaks == eLinebreakAny) {
|
|
destBuffer = ConvertUnknownBreaks(*aIoBuffer, sourceLen, dstBreaks);
|
|
} else {
|
|
destBuffer = ConvertBreaks(*aIoBuffer, sourceLen, srcBreaks, dstBreaks);
|
|
}
|
|
|
|
if (!destBuffer) {
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
*aIoBuffer = destBuffer;
|
|
if (aOutLen) {
|
|
*aOutLen = sourceLen;
|
|
}
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
ConvertUnicharLineBreaks
|
|
|
|
----------------------------------------------------------------------------*/
|
|
char16_t*
|
|
nsLinebreakConverter::ConvertUnicharLineBreaks(const char16_t* aSrc,
|
|
ELinebreakType aSrcBreaks,
|
|
ELinebreakType aDestBreaks,
|
|
int32_t aSrcLen,
|
|
int32_t* aOutLen)
|
|
{
|
|
NS_ASSERTION(aDestBreaks != eLinebreakAny &&
|
|
aSrcBreaks != eLinebreakSpace, "Invalid parameter");
|
|
if (!aSrc) {
|
|
return nullptr;
|
|
}
|
|
|
|
int32_t bufLen = (aSrcLen == kIgnoreLen) ? NS_strlen(aSrc) + 1 : aSrcLen;
|
|
|
|
char16_t* resultString;
|
|
if (aSrcBreaks == eLinebreakAny) {
|
|
resultString = ConvertUnknownBreaks(aSrc, bufLen,
|
|
GetLinebreakString(aDestBreaks));
|
|
} else
|
|
resultString = ConvertBreaks(aSrc, bufLen, GetLinebreakString(aSrcBreaks),
|
|
GetLinebreakString(aDestBreaks));
|
|
|
|
if (aOutLen) {
|
|
*aOutLen = bufLen;
|
|
}
|
|
return resultString;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------------
|
|
ConvertStringLineBreaks
|
|
|
|
----------------------------------------------------------------------------*/
|
|
nsresult
|
|
nsLinebreakConverter::ConvertUnicharLineBreaksInSitu(
|
|
char16_t** aIoBuffer, ELinebreakType aSrcBreaks, ELinebreakType aDestBreaks,
|
|
int32_t aSrcLen, int32_t* aOutLen)
|
|
{
|
|
NS_ASSERTION(aIoBuffer && *aIoBuffer, "Null pointer passed");
|
|
if (!aIoBuffer || !*aIoBuffer) {
|
|
return NS_ERROR_NULL_POINTER;
|
|
}
|
|
NS_ASSERTION(aDestBreaks != eLinebreakAny &&
|
|
aSrcBreaks != eLinebreakSpace, "Invalid parameter");
|
|
|
|
int32_t sourceLen =
|
|
(aSrcLen == kIgnoreLen) ? NS_strlen(*aIoBuffer) + 1 : aSrcLen;
|
|
|
|
// can we convert in-place?
|
|
const char* srcBreaks = GetLinebreakString(aSrcBreaks);
|
|
const char* dstBreaks = GetLinebreakString(aDestBreaks);
|
|
|
|
if ((aSrcBreaks != eLinebreakAny) &&
|
|
(strlen(srcBreaks) == 1) &&
|
|
(strlen(dstBreaks) == 1)) {
|
|
ConvertBreaksInSitu(*aIoBuffer, sourceLen, *srcBreaks, *dstBreaks);
|
|
if (aOutLen) {
|
|
*aOutLen = sourceLen;
|
|
}
|
|
} else {
|
|
char16_t* destBuffer;
|
|
|
|
if (aSrcBreaks == eLinebreakAny) {
|
|
destBuffer = ConvertUnknownBreaks(*aIoBuffer, sourceLen, dstBreaks);
|
|
} else {
|
|
destBuffer = ConvertBreaks(*aIoBuffer, sourceLen, srcBreaks, dstBreaks);
|
|
}
|
|
|
|
if (!destBuffer) {
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
}
|
|
*aIoBuffer = destBuffer;
|
|
if (aOutLen) {
|
|
*aOutLen = sourceLen;
|
|
}
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
ConvertStringLineBreaks
|
|
|
|
----------------------------------------------------------------------------*/
|
|
nsresult
|
|
nsLinebreakConverter::ConvertStringLineBreaks(nsString& aIoString,
|
|
ELinebreakType aSrcBreaks,
|
|
ELinebreakType aDestBreaks)
|
|
{
|
|
|
|
NS_ASSERTION(aDestBreaks != eLinebreakAny &&
|
|
aSrcBreaks != eLinebreakSpace, "Invalid parameter");
|
|
|
|
// nothing to do
|
|
if (aIoString.IsEmpty()) {
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult rv;
|
|
|
|
// remember the old buffer in case
|
|
// we blow it away later
|
|
nsString::char_iterator stringBuf;
|
|
aIoString.BeginWriting(stringBuf);
|
|
|
|
int32_t newLen;
|
|
|
|
rv = ConvertUnicharLineBreaksInSitu(&stringBuf,
|
|
aSrcBreaks, aDestBreaks,
|
|
aIoString.Length() + 1, &newLen);
|
|
if (NS_FAILED(rv)) {
|
|
return rv;
|
|
}
|
|
|
|
if (stringBuf != aIoString.get()) {
|
|
aIoString.Adopt(stringBuf);
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
|
|
|