/* Resolve dependency, decrease refcount */ static int g_itemResolveDependency(void* o, void* userData) { g_dependency dep; corto_depresolver data; dep = o; data = userData; if (!dep->processed) { switch(dep->kind) { case CORTO_DECLARED: dep->item->declareCount--; corto_assert(dep->item->declareCount >= 0, "negative declareCount for item '%s'.", corto_nameof(dep->item->o)); if (!dep->item->declareCount) { corto_llInsert(data->toPrint, dep->item); } break; case CORTO_DEFINED: dep->item->defineCount--; corto_assert(dep->item->defineCount >= 0, "negative defineCount for item '%s'.", corto_nameof(dep->item->o)); if (!dep->item->defineCount) { corto_llInsert(data->toPrint, dep->item); } break; } } dep->processed = TRUE; return 1; }
/* Append one list to another */ void corto_llAppendList(corto_ll l1, corto_ll l2) { corto_llNode ptr; ptr = l2->first; while(ptr) { corto_llInsert(l1, ptr->data); ptr = ptr->next; } }
/* Collect initial objects */ int g_itemCollectinitial(void* o, void* userData) { g_item item; corto_depresolver data; item = o; data = userData; if (!item->declareCount) { corto_llInsert(data->toPrint, item); } return 1; }
/* Create new item */ g_item g_itemNew(corto_object o, corto_depresolver data) { g_item result; result = corto_alloc(sizeof(struct g_item)); result->o = o; result->declared = FALSE; result->defined = FALSE; result->declareCount = 0; result->defineCount = 0; result->onDeclared = NULL; result->onDefined = NULL; if (o == root_o) { result->declared = TRUE; result->defined = TRUE; } corto_llInsert(data->items, result); return result; }