function void decl_dll_list_push(Decl*l,Decl*node){ if (l->list_decl.first==0){ l->list_decl.first=l->list_decl.last=node; node->prev=0; node->next=0; } else { l->list_decl.last->next=node; node->prev=l->list_decl.last; node->next=0; l->list_decl.last=node; } node->parent=l; } function void decl_dll_list_push_front(Decl*l,Decl*node){ if (l->list_decl.first==0){ l->list_decl.first=l->list_decl.last=node; node->prev=0; node->next=0; } else { node->next=l->list_decl.first; l->list_decl.first->prev=node; node->prev=0; l->list_decl.first=node; } node->parent=l; } function void decl_list_remove(Decl*l,Decl*node){ if (l->list_decl.first==l->list_decl.last){ assert(node==l->list_decl.last); l->list_decl.first=l->list_decl.last=0; } else if (l->list_decl.last==node){ l->list_decl.last=l->list_decl.last->prev; l->list_decl.last->next=0; } else if (l->list_decl.first==node){ l->list_decl.first=l->list_decl.first->next; l->list_decl.first->prev=0; } else { node->prev->next=node->next; node->next->prev=node->prev; } node->parent=0; node->prev=0; node->next=0; }