void -.ptr reverse (p_p_list_item -&w list)
             where (list :: *)
{
  void shift ()                                     
  {
    before = previous = current = current->next;
  }

  p_list_item before, previous = .;
  p_list_item current = *list;

  while (current)
  {
    if (before !! previous)
    {
      shift ();
    }

    if (before !& previous)
    {
      shift ();
    }

    if (before && previous)
    {
      previous->next = before; shift ();
    }
  }

  *list->next = .;

  if (previous) 
  {
    previous->next = before; *list = previous;
  }
}

void reverse (p_p_list_item -&w list)
          if (!*list)
{
  ;
}