#include #include struct obj_symbol { struct obj_symbol *next; unsigned int size; }; struct common_entry { struct common_entry *next; struct obj_symbol *sym; }; extern void do_something(struct obj_symbol *sym); void obj_allocate_commons(struct obj_symbol *sym) { struct common_entry *common_head = NULL; for (; sym ; sym = sym->next) { struct common_entry **p, *n; for (p = &common_head; *p ; p = &(*p)->next) if (sym->size <= (*p)->sym->size) break; n = alloca(sizeof(*n)); n->next = *p; n->sym = sym; *p = n; } { struct common_entry *p; for (p = common_head; p ; p = p->next) do_something(p->sym); } }