/*=============== aux_do_comp ===================*/
/* compatta la memoria per ottenere il numero di clicks passati come parametro *** scorre la lista dei buchi finche` la somma delle loro lunghezze e` maggiore o uguale al numero di clicks richiesti e salva l'indirizzo dell'ultimo buco necessario *** a partire dal primo buco compatta attraverso chiamate alla move_block tutti i blocchi compresi tra due buchi successivi della corrispondente lista fino ad arrivare all'ultimo buco necessario *** cancella dalla lista dei buchi quelli cosi' utilizzati *** libera la memoria inutilizzata *** ritorna l'indirizzo iniziale della memoria richiesta */ PUBLIC phys_clicks aux_do_comp (clicks) phys_clicks clicks; { phys_clicks hole_len, stop_addr, end_block, gap; register struct hole * hp, * hp_aux; hp=hole_head; if (hp!=NIL_HOLE) && (hp->h_next != NIL_HOLE)) { hole_len=0; while (hp != NIL_HOLE) { hole_len += hp->h_len; if (hole_len < clicks) hp= hp->h_next; else break; } if (hole_len >= clicks) /* hp==NIL_HOLE sse hole_len < clicks */ { stop_addr = hp->h_base; hp = hole_head; end_block = hp->h_base; gap = hp->h_len; while (hp->h_next != NIL_HOLE) { if (HP->h_bbase < stop_addr) { end_block = move_block (end_block, gap, (hp->h_next)->h_base); hp = hp->h_next; gap = (hp->h_base + hp->h_len) - end_block; } else break; } /* libera slots dei buchi utilizzati */ hp_aux = hp->h_next; hp->h_next = free_slots; free_slots = hole_head; hole_head = hp_aux; /* libera la parte di memoria eventualmente rimasta */ if (gap > clicks) free_mem (end_block+clicks, gap-clicks); return (end_block); } } return (NO_MEM); }