/*=============== 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);
}