⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glist.c

📁 嵌入式下基于MiniGUI的Web Browser
💻 C
📖 第 1 页 / 共 2 页
字号:
	}    }  return list;}static inline GList*_g_list_remove_link (GList *list,		     GList *link){  if (link)    {      if (link->prev)	link->prev->next = link->next;      if (link->next)	link->next->prev = link->prev;            if (link == list)	list = list->next;            link->next = NULL;      link->prev = NULL;    }    return list;}GList*g_list_remove_link (GList *list,		    GList *link){  return _g_list_remove_link (list, link);}GList*g_list_delete_link (GList *list,		    GList *link){  list = _g_list_remove_link (list, link);  _g_list_free_1 (link);  return list;}GList*g_list_copy (GList *list){  GList *new_list = NULL;  if (list)    {      GList *last;      new_list = _g_list_alloc ();      new_list->data = list->data;      last = new_list;      list = list->next;      while (list)	{	  last->next = _g_list_alloc ();	  last->next->prev = last;	  last = last->next;	  last->data = list->data;	  list = list->next;	}    }  return new_list;}GList*g_list_reverse (GList *list){  GList *last;    last = NULL;  while (list)    {      last = list;      list = last->next;      last->next = last->prev;      last->prev = list;    }    return last;}GList*g_list_nth (GList *list,	    guint  n){  while ((n-- > 0) && list)    list = list->next;    return list;}GList*g_list_nth_prev (GList *list,		 guint  n){  while ((n-- > 0) && list)    list = list->prev;    return list;}gpointerg_list_nth_data (GList     *list,		 guint      n){  while ((n-- > 0) && list)    list = list->next;    return list ? list->data : NULL;}GList*g_list_find (GList         *list,	     gconstpointer  data){  while (list)    {      if (list->data == data)	break;      list = list->next;    }    return list;}GList*g_list_find_custom (GList         *list,		    gconstpointer  data,		    GCompareFunc   func){  g_return_val_if_fail (func != NULL, list);  while (list)    {      if (! func (list->data, data))	return list;      list = list->next;    }  return NULL;}gintg_list_position (GList *list,		 GList *link){  gint i;  i = 0;  while (list)    {      if (list == link)	return i;      i++;      list = list->next;    }  return -1;}gintg_list_index (GList         *list,	      gconstpointer  data){  gint i;  i = 0;  while (list)    {      if (list->data == data)	return i;      i++;      list = list->next;    }  return -1;}GList*g_list_last (GList *list){  if (list)    {      while (list->next)	list = list->next;    }    return list;}GList*g_list_first (GList *list){  if (list)    {      while (list->prev)	list = list->prev;    }    return list;}guintg_list_length (GList *list){  guint length;    length = 0;  while (list)    {      length++;      list = list->next;    }    return length;}voidg_list_foreach (GList	 *list,		GFunc	  func,		gpointer  user_data){  while (list)    {      GList *next = list->next;      (*func) (list->data, user_data);      list = next;    }}GList*g_list_insert_sorted (GList        *list,                      gpointer      data,                      GCompareFunc  func){  GList *tmp_list = list;  GList *new_list;  gint cmp;  g_return_val_if_fail (func != NULL, list);    if (!list)     {      new_list = _g_list_alloc ();      new_list->data = data;      return new_list;    }    cmp = (*func) (data, tmp_list->data);    while ((tmp_list->next) && (cmp > 0))    {      tmp_list = tmp_list->next;      cmp = (*func) (data, tmp_list->data);    }  new_list = _g_list_alloc ();  new_list->data = data;  if ((!tmp_list->next) && (cmp > 0))    {      tmp_list->next = new_list;      new_list->prev = tmp_list;      return list;    }     if (tmp_list->prev)    {      tmp_list->prev->next = new_list;      new_list->prev = tmp_list->prev;    }  new_list->next = tmp_list;  tmp_list->prev = new_list;   if (tmp_list == list)    return new_list;  else    return list;}static GList *g_list_sort_merge (GList     *l1, 		   GList     *l2,		   GFunc     compare_func,		   gboolean  use_data,		   gpointer  user_data){  GList list, *l, *lprev;  gint cmp;  l = &list;   lprev = NULL;  while (l1 && l2)    {      if (use_data)	cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data);      else	cmp = ((GCompareFunc) compare_func) (l1->data, l2->data);      if (cmp <= 0)        {	  l->next = l1;	  l = l->next;	  l->prev = lprev; 	  lprev = l;	  l1 = l1->next;        }       else 	{	  l->next = l2;	  l = l->next;	  l->prev = lprev; 	  lprev = l;	  l2 = l2->next;        }    }  l->next = l1 ? l1 : l2;  l->next->prev = l;  return list.next;}static GList* g_list_sort_real (GList    *list,		  GFunc     compare_func,		  gboolean  use_data,		  gpointer  user_data){  GList *l1, *l2;    if (!list)     return NULL;  if (!list->next)     return list;    l1 = list;   l2 = list->next;  while ((l2 = l2->next) != NULL)    {      if ((l2 = l2->next) == NULL) 	break;      l1 = l1->next;    }  l2 = l1->next;   l1->next = NULL;   return g_list_sort_merge (g_list_sort_real (list, compare_func, use_data, user_data),			    g_list_sort_real (l2, compare_func, use_data, user_data),			    compare_func,			    use_data,			    user_data);}GList *g_list_sort (GList        *list,	     GCompareFunc  compare_func){  return g_list_sort_real (list, (GFunc) compare_func, FALSE, NULL);			    }GList *g_list_sort_with_data (GList            *list,		       GCompareDataFunc  compare_func,		       gpointer          user_data){  return g_list_sort_real (list, (GFunc) compare_func, TRUE, user_data);}static GList* g_list_sort2 (GList       *list,	      GCompareFunc compare_func){  GSList *runs = NULL;  GList *tmp;  /* Degenerate case.  */  if (!list) return NULL;  /* Assume: list = [12,2,4,11,2,4,6,1,1,12].  */  for (tmp = list; tmp; )    {      GList *tmp2;      for (tmp2 = tmp;	   tmp2->next && compare_func (tmp2->data, tmp2->next->data) <= 0;	   tmp2 = tmp2->next)	/* Nothing */;      runs = g_slist_append (runs, tmp);      tmp = tmp2->next;      tmp2->next = NULL;    }  /* Now: runs = [[12],[2,4,11],[2,4,6],[1,1,12]].  */    while (runs->next)    {      /* We have more than one run.  Merge pairwise.  */      GSList *dst, *src, *dstprev = NULL;      dst = src = runs;      while (src && src->next)	{	  dst->data = g_list_sort_merge (src->data,					 src->next->data,					 (GFunc) compare_func,					 FALSE, NULL);	  dstprev = dst;	  dst = dst->next;	  src = src->next->next;	}      /* If number of runs was odd, just keep the last.  */      if (src)	{	  dst->data = src->data;	  dstprev = dst;	  dst = dst->next;	}      dstprev->next = NULL;      g_slist_free (dst);    }  /* After 1st loop: runs = [[2,4,11,12],[1,1,2,4,6,12]].  */  /* After 2nd loop: runs = [[1,1,2,2,4,4,6,11,12,12]].  */  list = runs->data;  g_slist_free (runs);  return list;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -