Esempio n. 1
0
/*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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
// преобразование словаря групп времени в удобный для поиска вид
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;
};