static bool_t ValidateSize(const ebml_element *p) { return EBML_ElementIsFiniteSize(p) && (p->DataSize == 8 || p->DataSize == 0); }
filepos_t EBML_VoidReplaceWith(ebml_element *Void, ebml_element *ReplacedWith, stream *Output, bool_t ComeBackAfterward, bool_t bWithDefault) { filepos_t CurrentPosition; assert(Node_IsPartOf(Void,EBML_VOID_CLASS)); EBML_ElementUpdateSize(ReplacedWith,bWithDefault,0); if (EBML_ElementFullSize(Void,1) < EBML_ElementFullSize(ReplacedWith,1)) // the element can't be written here ! return INVALID_FILEPOS_T; if (EBML_ElementFullSize(Void,1) - EBML_ElementFullSize(ReplacedWith,1) == 1) // there is not enough space to put a filling element return INVALID_FILEPOS_T; CurrentPosition = Stream_Seek(Output,0,SEEK_CUR); Stream_Seek(Output,Void->ElementPosition,SEEK_SET); EBML_ElementRender(ReplacedWith,Output,bWithDefault,0,1,NULL); if (EBML_ElementFullSize(Void,1) - EBML_ElementFullSize(ReplacedWith,1) > 1) { // fill the rest with another void element ebml_element *aTmp = EBML_ElementCreate(Void,Void->Context,0,NULL); if (aTmp) { filepos_t HeadBefore,HeadAfter; EBML_VoidSetFullSize(aTmp, EBML_ElementFullSize(Void,1) - EBML_ElementFullSize(ReplacedWith,1)); HeadBefore = EBML_ElementFullSize(aTmp,1) - aTmp->DataSize; aTmp->DataSize = aTmp->DataSize - EBML_CodedSizeLength(aTmp->DataSize, aTmp->SizeLength, EBML_ElementIsFiniteSize(aTmp)); HeadAfter = EBML_ElementFullSize(aTmp,1) - aTmp->DataSize; if (HeadBefore != HeadAfter) aTmp->SizeLength = (int8_t)(EBML_CodedSizeLength(aTmp->DataSize, aTmp->SizeLength, EBML_ElementIsFiniteSize(aTmp)) - (HeadAfter - HeadBefore)); EBML_ElementRenderHead(aTmp,Output,0,NULL); NodeDelete((node*)aTmp); } } if (ComeBackAfterward) Stream_Seek(Output,CurrentPosition,SEEK_SET); return EBML_ElementFullSize(Void,1); }