mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-11-04 01:58:54 +01:00 
			
		
		
		
	gslist: Simplified node removal and got rid of some code duplication
Merged two almost identical functions for removing at most one or all nodes containing some data. Also simplified the code a bit by using a pointer to a pointer (see http://wordaligned.org/articles/two-star-programming). (Modified by Philip Withnall to fix two code formatting nitpicks.) https://bugzilla.gnome.org/show_bug.cgi?id=722256
This commit is contained in:
		
				
					committed by
					
						
						Philip Withnall
					
				
			
			
				
	
			
			
			
						parent
						
							6f8073d44a
						
					
				
				
					commit
					54e3ed17f0
				
			@@ -386,6 +386,32 @@ g_slist_concat (GSList *list1, GSList *list2)
 | 
			
		||||
  return list1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GSList*
 | 
			
		||||
_g_slist_remove_data (GSList        *list,
 | 
			
		||||
                      gconstpointer  data,
 | 
			
		||||
                      gboolean       all)
 | 
			
		||||
{
 | 
			
		||||
  GSList *tmp = NULL;
 | 
			
		||||
  GSList **previous_ptr = &list;
 | 
			
		||||
 | 
			
		||||
  while (*previous_ptr)
 | 
			
		||||
    {
 | 
			
		||||
      tmp = *previous_ptr;
 | 
			
		||||
      if (tmp->data == data)
 | 
			
		||||
        {
 | 
			
		||||
          *previous_ptr = tmp->next;
 | 
			
		||||
          g_slist_free_1 (tmp);
 | 
			
		||||
          if (!all)
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          previous_ptr = &tmp->next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return list;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * g_slist_remove:
 | 
			
		||||
 * @list: a #GSList
 | 
			
		||||
@@ -401,26 +427,7 @@ GSList*
 | 
			
		||||
g_slist_remove (GSList        *list,
 | 
			
		||||
                gconstpointer  data)
 | 
			
		||||
{
 | 
			
		||||
  GSList *tmp, *prev = NULL;
 | 
			
		||||
 | 
			
		||||
  tmp = list;
 | 
			
		||||
  while (tmp)
 | 
			
		||||
    {
 | 
			
		||||
      if (tmp->data == data)
 | 
			
		||||
        {
 | 
			
		||||
          if (prev)
 | 
			
		||||
            prev->next = tmp->next;
 | 
			
		||||
          else
 | 
			
		||||
            list = tmp->next;
 | 
			
		||||
 | 
			
		||||
          g_slist_free_1 (tmp);
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      prev = tmp;
 | 
			
		||||
      tmp = prev->next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return list;
 | 
			
		||||
  return _g_slist_remove_data (list, data, FALSE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -439,58 +446,27 @@ GSList*
 | 
			
		||||
g_slist_remove_all (GSList        *list,
 | 
			
		||||
                    gconstpointer  data)
 | 
			
		||||
{
 | 
			
		||||
  GSList *tmp, *prev = NULL;
 | 
			
		||||
 | 
			
		||||
  tmp = list;
 | 
			
		||||
  while (tmp)
 | 
			
		||||
    {
 | 
			
		||||
      if (tmp->data == data)
 | 
			
		||||
        {
 | 
			
		||||
          GSList *next = tmp->next;
 | 
			
		||||
 | 
			
		||||
          if (prev)
 | 
			
		||||
            prev->next = next;
 | 
			
		||||
          else
 | 
			
		||||
            list = next;
 | 
			
		||||
 | 
			
		||||
          g_slist_free_1 (tmp);
 | 
			
		||||
          tmp = next;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          prev = tmp;
 | 
			
		||||
          tmp = prev->next;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return list;
 | 
			
		||||
  return _g_slist_remove_data (list, data, TRUE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline GSList*
 | 
			
		||||
_g_slist_remove_link (GSList *list,
 | 
			
		||||
                      GSList *link)
 | 
			
		||||
{
 | 
			
		||||
  GSList *tmp;
 | 
			
		||||
  GSList *prev;
 | 
			
		||||
  GSList *tmp = NULL;
 | 
			
		||||
  GSList **previous_ptr = &list;
 | 
			
		||||
 | 
			
		||||
  prev = NULL;
 | 
			
		||||
  tmp = list;
 | 
			
		||||
 | 
			
		||||
  while (tmp)
 | 
			
		||||
  while (*previous_ptr)
 | 
			
		||||
    {
 | 
			
		||||
      tmp = *previous_ptr;
 | 
			
		||||
      if (tmp == link)
 | 
			
		||||
        {
 | 
			
		||||
          if (prev)
 | 
			
		||||
            prev->next = tmp->next;
 | 
			
		||||
          if (list == tmp)
 | 
			
		||||
            list = list->next;
 | 
			
		||||
 | 
			
		||||
          *previous_ptr = tmp->next;
 | 
			
		||||
          tmp->next = NULL;
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      prev = tmp;
 | 
			
		||||
      tmp = tmp->next;
 | 
			
		||||
      previous_ptr = &tmp->next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return list;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user