/*PLONK_INLINE_LOW*/ TimeStamp& TimeStamp::operator+= (const double offset) throw() { if (pl_IsInfD (offset)) { this->time = 0; this->fraction = offset; } else { const double correctedOffset = offset + this->fraction; const LongLong timeOffset = LongLong (correctedOffset); this->time += timeOffset; this->fraction = correctedOffset - timeOffset; // carry the fraction if (this->fraction < 0.0) { this->time--; this->fraction += 1.0; } plonk_assert (fractionIsValid (this->fraction)); } return *this; }
PlankResult BinaryFileInternal::dynamicMemoryReadCallback (PlankFileRef p, PlankP ptr, int maximumBytes, int* bytesReadOut) { plonk_assert (p != 0); plonk_assert (ptr != 0); plonk_assert (maximumBytes > 0); PlankResult result; UnsignedChar* src; ByteArray* array = static_cast<ByteArray*> (p->stream); LongLong size = array->length(); int bytesRead; result = PlankResult_OK; bytesRead = int (plonk::min (LongLong (maximumBytes), size - p->position)); if (bytesRead <= 0) { result = PlankResult_FileEOF; goto exit; } src = (UnsignedChar*)array->getArray() + p->position; Memory::copy (ptr, src, bytesRead); p->position += bytesRead; if (bytesReadOut) *bytesReadOut = bytesRead; exit: return result; }
// преобразование словаря групп времени в удобный для поиска вид bool CSemanticsHolder::InitTimeUnits() { // инициализация констант BYTE GramFunctDomNo = GetRoss(TimeRoss)->GetDomenNoByDomStr("D_GRAM_FUNCT"); int AbbrFunctName = GetRoss(TimeRoss)->GetItemNoByItemStr("СОКР", GramFunctDomNo); int AbbrFunctPluralName = GetRoss(TimeRoss)->GetItemNoByItemStr("СОКР_мн", GramFunctDomNo); m_TimeAbbrPairs.clear(); m_TimeUnits.clear(); // идем по всем статьям словаря групп времени for (size_t UnitNo =0; UnitNo < GetRoss(TimeRoss)->GetUnitsSize(); UnitNo++) { try { CTimeUnit U; U.m_UnitNo = UnitNo; if (!GetRoss(TimeRoss)->IsEmptyArticle(UnitNo)) // по словарной статье for (size_t i = GetRoss(TimeRoss)->GetUnitStartPos(UnitNo); i<= GetRoss(TimeRoss)->GetUnitEndPos(UnitNo); i++) { TCortege C = GetCortege(GetRoss(TimeRoss), i); //незаполненное поле? if (C.m_DomItemNos[0] == -1) continue; // строю массив U.m_Places по полю CONTENT string FieldStr = (const char*)GetRoss(TimeRoss)->Fields[C.m_FieldNo].FieldStr; if ( (FieldStr == "CONTENT") && (C.m_LeafId == 0) && (C.m_BracketLeafId == 0) ) { string Lemma; string Contents = GetRossHolder(TimeRoss)->GetDomItemStrInner(C.m_DomItemNos[0]); for (BYTE PlaceNo =0; GetLemmaFromTitle(Contents, PlaceNo, Lemma); PlaceNo++) U.m_Places.push_back(Lemma); }; if ( (FieldStr == "RESTR") && (C.m_LeafId == 0) && (C.m_BracketLeafId == 0) ) { string Contents = GetRossHolder(TimeRoss)->GetDomItemStrInner(C.m_DomItemNos[0]); if (Contents == "свобод") U.m_bCanFillNotTimeValency = true; }; // инициализирую перечень всех необходимых синтаксических отношений их поля SYNREP if ( (FieldStr == "SYNREP") && (C.m_LeafId == 0) && (C.m_BracketLeafId == 0) ) { long PlaceNo1 = atoi(GetRossHolder(TimeRoss)->GetDomItemStrInner(C.m_DomItemNos[1])); long PlaceNo2 = atoi(GetRossHolder(TimeRoss)->GetDomItemStrInner(C.m_DomItemNos[2])); if (!PlaceNo1 || !PlaceNo2) continue; string SynGrp = GetRossHolder(TimeRoss)->GetDomItemStrInner(C.m_DomItemNos[0]); rml_TRACE (SynGrp.c_str()); U.m_Rels.push_back(CSynRelation(PlaceNo1-1, PlaceNo2-1, SynGrp)); }; // инициализирую глобальный перечень наборов (полное временное слово, аббревиатура, аббревиатурная функция), // который называется m_TimeAbbrPairs // аббревиатурная функция = АББР_мн, АББР, АББР_ед // например:(год, гг.,АББР_мн) // (год, г., АББР_ед) if ( (FieldStr == "DERIV") && (C.m_LeafId == 0) && (C.m_BracketLeafId == 0) ) { if ( (C.m_DomItemNos[0] != AbbrFunctPluralName) && (C.m_DomItemNos[0] != AbbrFunctName) ) continue; string FullForm = GetRoss(TimeRoss)->GetEntryStr(UnitNo); EngRusMakeUpper(FullForm); string AbbrForm = GetRossHolder(TimeRoss)->GetDomItemStrInner(C.m_DomItemNos[1]); EngRusMakeUpper(AbbrForm); m_TimeAbbrPairs.push_back(CAbbrFunct(AbbrForm, FullForm, GetRossHolder(TimeRoss)->GetDomItemStrInner(C.m_DomItemNos[0]))); }; // инициализирую перечень лексического заполнения дырок, который берется из // полей LEX и PREP if (FieldStr == "LEX") { string S = GetRossHolder(TimeRoss)->GetDomItemStrInner(C.m_DomItemNos[0]); EngRusMakeUpper(S); long LexFillingNoNo = U.GetLexicalFillingNo(CTimeLexicalFilling(C.m_LeafId, C.m_BracketLeafId)); U.m_LexicalFillings[LexFillingNoNo].m_LexFets.push_back(stringLong(S,C.m_LevelId)); } else if (FieldStr == "PREP") { string Prep = GetRossHolder(TimeRoss)->GetDomItemStrInner(C.m_DomItemNos[0]); WORD PrepNo = GetRossHolder(OborRoss)->LocateUnit(Prep.c_str(),1); if (PrepNo == ErrUnitNo) { string Q =Format ("Предлог %s в статье %s не найден в словаре оборотов", Prep.c_str(), GetRoss(TimeRoss)->GetEntryStr(UnitNo).c_str()); ErrorMessage (Q); continue; }; long LexFillingNoNo = U.GetLexicalFillingNo(CTimeLexicalFilling(C.m_LeafId, C.m_BracketLeafId)); U.m_LexicalFillings[LexFillingNoNo].m_Preps.push_back(LongLong(PrepNo,C.m_LevelId)); }; }; m_TimeUnits.push_back(U); } catch (...) { ErrorMessage (Format("Cannot index article \"%s\"", GetRoss(TimeRoss)->GetEntryStr(UnitNo).c_str())); return false; }; }; return true; };