void SG_vector_i64__alloc__from_varray(SG_context* pCtx, SG_varray* pva, SG_vector_i64 ** ppVector) { SG_uint32 count = 0; SG_uint32 i = 0; SG_vector_i64* pvec = NULL; SG_ERR_CHECK( SG_varray__count(pCtx, pva, &count) ); SG_ERR_CHECK( SG_vector_i64__alloc(pCtx, &pvec, count) ); for (i=0; i<count; i++) { SG_int64 v = 0; SG_ERR_CHECK( SG_varray__get__int64(pCtx, pva, i, &v) ); SG_ERR_CHECK( SG_vector_i64__append(pCtx, pvec, v, NULL) ); } *ppVector = pvec; pvec = NULL; return; fail: SG_VECTOR_I64_NULLFREE(pCtx, pvec); return; }
// Helper function for _tree__init__continuation() static void _tree__add_subtoken(SG_context * pCtx, _tree_t * pTree, _node_t * pParent, SG_varray * pSubtoken) { SG_int64 revno = 0; char * szHid = NULL; _node_t * pNodeRef = NULL; SG_uint32 count = 0; SG_uint32 i = 0; SG_uint16 lastElementType = 0; SG_varray * pSubsubtoken = NULL; SG_stringarray * psa = NULL; ++pTree->indentLevel; SG_ERR_CHECK( SG_varray__get__int64(pCtx, pSubtoken, 0, &revno) ); SG_ERR_CHECK( SG_repo__find_dagnode_by_rev_id(pCtx, pTree->pRepoRef, SG_DAGNUM__VERSION_CONTROL, (SG_uint32)revno, &szHid) ); SG_ERR_CHECK( _tree__add_new_node(pCtx, pTree, pParent, szHid, &pNodeRef) ); pNodeRef->isPending = SG_FALSE; SG_NULLFREE(pCtx, szHid); SG_ERR_CHECK( SG_varray__count(pCtx, pSubtoken, &count) ); SG_ERR_CHECK( SG_varray__typeof(pCtx, pSubtoken, count-1, &lastElementType) ); if(lastElementType==SG_VARIANT_TYPE_VARRAY) { SG_ERR_CHECK( SG_varray__get__varray(pCtx, pSubtoken, count-1, &pSubsubtoken) ); --count; } for(i=1; i<count; ++i) { _node_t * pRefChildNode = NULL; SG_ERR_CHECK( SG_varray__get__int64(pCtx, pSubtoken, i, &revno) ); if(i==1 && revno==0) { // Revno 0 in the as the first child means "Use the LCA for the baseline". SG_uint32 j = 0; if(pSubsubtoken!=NULL) { // LCA would not include nodes in the sub-token. Just error out. SG_ERR_THROW(SG_ERR_INVALIDARG); } if(count-2<2) { // This would be interpreted as merging a node with itself or with nothing. SG_ERR_THROW(SG_ERR_INVALIDARG); } SG_ERR_CHECK( SG_STRINGARRAY__ALLOC(pCtx, &psa, count-2) ); for(j=2; j<count; ++j) { SG_ERR_CHECK( SG_varray__get__int64(pCtx, pSubtoken, j, &revno) ); SG_ERR_CHECK( SG_repo__find_dagnode_by_rev_id(pCtx, pTree->pRepoRef, SG_DAGNUM__VERSION_CONTROL, (SG_uint32)revno, &szHid) ); SG_ERR_CHECK( SG_stringarray__add(pCtx, psa, szHid) ); SG_NULLFREE(pCtx, szHid); } SG_ERR_CHECK( SG_dagquery__highest_revno_common_ancestor(pCtx, pTree->pRepoRef, SG_DAGNUM__VERSION_CONTROL, psa, &szHid) ); SG_STRINGARRAY_NULLFREE(pCtx, psa); } else { SG_ERR_CHECK( SG_repo__find_dagnode_by_rev_id(pCtx, pTree->pRepoRef, SG_DAGNUM__VERSION_CONTROL, (SG_uint32)revno, &szHid) ); } SG_ERR_CHECK( _tree__add_new_node(pCtx, pTree, pNodeRef, szHid, &pRefChildNode) ); pTree->pNextResult = pRefChildNode; SG_ERR_CHECK( _node_list__append(pCtx, &pTree->pending, &pRefChildNode) ); SG_NULLFREE(pCtx, szHid); } if(pSubsubtoken!=NULL) { SG_ERR_CHECK( _tree__add_subtoken(pCtx, pTree, pNodeRef, pSubsubtoken) ); } return; fail: SG_NULLFREE(pCtx, szHid); SG_STRINGARRAY_NULLFREE(pCtx, psa); }