static void RemoveControlCharactersFrom(nsAString& aStr, TextRangeArray* aRanges) { size_t firstControlCharOffset = FindFirstControlCharacter(aStr); if (firstControlCharOffset == (size_t)-1) { return; } nsAutoString copy(aStr); const char16_t* sourceBegin = copy.BeginReading(); const char16_t* sourceEnd = copy.EndReading(); char16_t* dest = aStr.BeginWriting(); if (NS_WARN_IF(!dest)) { return; } char16_t* curDest = dest + firstControlCharOffset; size_t i = firstControlCharOffset; for (const char16_t* source = sourceBegin + firstControlCharOffset; source < sourceEnd; ++source) { if (*source == '\t' || *source == '\n' || !IsControlChar(*source)) { *curDest = *source; ++curDest; ++i; } else if (aRanges) { aRanges->RemoveCharacter(i); } } aStr.SetLength(curDest - dest); }
void CPDF_TextPage::AddCharInfoByRLDirection(wchar_t wChar, const PAGECHAR_INFO& info) { PAGECHAR_INFO info2 = info; if (IsControlChar(info2)) { info2.m_Index = -1; m_CharList.push_back(info2); return; } info2.m_Index = m_TextBuf.GetLength(); wChar = FX_GetMirrorChar(wChar); size_t nCount = Unicode_GetNormalization(wChar, nullptr); if (nCount == 0) { info2.m_Unicode = wChar; m_TextBuf.AppendChar(info2.m_Unicode); m_CharList.push_back(info2); return; } std::unique_ptr<wchar_t, FxFreeDeleter> pDst(FX_Alloc(wchar_t, nCount)); Unicode_GetNormalization(wChar, pDst.get()); for (size_t nIndex = 0; nIndex < nCount; ++nIndex) { info2.m_Unicode = pDst.get()[nIndex]; info2.m_Flag = FPDFTEXT_CHAR_PIECE; m_TextBuf.AppendChar(info2.m_Unicode); m_CharList.push_back(info2); } }
static size_t FindFirstControlCharacter(const nsAString& aStr) { const char16_t* sourceBegin = aStr.BeginReading(); const char16_t* sourceEnd = aStr.EndReading(); for (const char16_t* source = sourceBegin; source < sourceEnd; ++source) { if (*source != '\t' && IsControlChar(*source)) { return source - sourceBegin; } } return -1; }
int Sc_strlen(const char *str, int maxlen1, int maxlen2, bool accept_color_chars, bool accept_control_chars) { int a = maxlen1 < maxlen2 ? maxlen1 : maxlen2; int len = 0; while (a-- > 0) { len++; if (*str == 0) return len; if (!accept_control_chars && IsColorChar(*str)) return 0; if (!accept_control_chars && IsControlChar(*str)) return 0; str++; } return 0; }
void CPDF_TextPage::ParseTextPage() { m_bIsParsed = false; m_TextBuf.Clear(); m_CharList.clear(); m_pPreTextObj = nullptr; ProcessObject(); m_bIsParsed = true; m_CharIndex.clear(); const int nCount = CountChars(); if (nCount) m_CharIndex.push_back(0); for (int i = 0; i < nCount; ++i) { int indexSize = pdfium::CollectionSize<int>(m_CharIndex); const PAGECHAR_INFO& charinfo = m_CharList[i]; if (charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED || (charinfo.m_Unicode != 0 && !IsControlChar(charinfo)) || (charinfo.m_Unicode == 0 && charinfo.m_CharCode != 0)) { if (indexSize % 2) { m_CharIndex.push_back(1); } else { if (indexSize <= 0) continue; m_CharIndex[indexSize - 1] += 1; } } else { if (indexSize % 2) { if (indexSize <= 0) continue; m_CharIndex[indexSize - 1] = i + 1; } else { m_CharIndex.push_back(i + 1); } } } int indexSize = pdfium::CollectionSize<int>(m_CharIndex); if (indexSize % 2) m_CharIndex.erase(m_CharIndex.begin() + indexSize - 1); }