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

📄 glist.c

📁 嵌入式下基于MiniGUI的Web Browser
💻 C
📖 第 1 页 / 共 2 页
字号:
/* GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GLib Team and others 1997-2000.  See the AUTHORS * file for a list of people on the GLib Team.  See the ChangeLog * files for a list of changes.  These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/.  *//*  * MT safe */#ifdef HAVE_CONFIG_H#include "glibconfig.h"#endif#include "glib.h"#ifndef DISABLE_MEM_POOLSstruct _GAllocator /* from gmem.c */{  gchar         *name;  guint16        n_preallocs;  guint          is_unused : 1;  guint          type : 4;  GAllocator    *last;  GMemChunk     *mem_chunk;  GList		*free_lists; /* implementation specific */};static GAllocator	*current_allocator = NULL;G_LOCK_DEFINE_STATIC (current_allocator);/* HOLDS: current_allocator_lock */static voidg_list_validate_allocator (GAllocator *allocator){  g_return_if_fail (allocator != NULL);  g_return_if_fail (allocator->is_unused == TRUE);  if (allocator->type != G_ALLOCATOR_LIST)    {      allocator->type = G_ALLOCATOR_LIST;      if (allocator->mem_chunk)	{	  g_mem_chunk_destroy (allocator->mem_chunk);	  allocator->mem_chunk = NULL;	}    }  if (!allocator->mem_chunk)    {      allocator->mem_chunk = g_mem_chunk_new (allocator->name,					      sizeof (GList),					      sizeof (GList) * allocator->n_preallocs,					      G_ALLOC_ONLY);      allocator->free_lists = NULL;    }  allocator->is_unused = FALSE;}voidg_list_push_allocator(GAllocator *allocator){  G_LOCK (current_allocator);  g_list_validate_allocator (allocator);  allocator->last = current_allocator;  current_allocator = allocator;  G_UNLOCK (current_allocator);}voidg_list_pop_allocator (void){  G_LOCK (current_allocator);  if (current_allocator)    {      GAllocator *allocator;      allocator = current_allocator;      current_allocator = allocator->last;      allocator->last = NULL;      allocator->is_unused = TRUE;    }  G_UNLOCK (current_allocator);}static inline GList*_g_list_alloc (void){  GList *list;  G_LOCK (current_allocator);  if (!current_allocator)    {      GAllocator *allocator = g_allocator_new ("GLib default GList allocator",					       128);      g_list_validate_allocator (allocator);      allocator->last = NULL;      current_allocator = allocator;    }  if (!current_allocator->free_lists)    {      list = g_chunk_new (GList, current_allocator->mem_chunk);      list->data = NULL;    }  else    {      if (current_allocator->free_lists->data)	{	  list = current_allocator->free_lists->data;	  current_allocator->free_lists->data = list->next;	  list->data = NULL;	}      else	{	  list = current_allocator->free_lists;	  current_allocator->free_lists = list->next;	}    }  G_UNLOCK (current_allocator);  list->next = NULL;  list->prev = NULL;    return list;}GList*g_list_alloc (void){  return _g_list_alloc ();}voidg_list_free (GList *list){  if (list)    {      GList *last_node = list;#ifdef ENABLE_GC_FRIENDLY      while (last_node->next)        {          last_node->data = NULL;          last_node->prev = NULL;          last_node = last_node->next;        }      last_node->data = NULL;      last_node->prev = NULL;#else /* !ENABLE_GC_FRIENDLY */      list->data = list->next;  #endif /* ENABLE_GC_FRIENDLY */      G_LOCK (current_allocator);      last_node->next = current_allocator->free_lists;      current_allocator->free_lists = list;      G_UNLOCK (current_allocator);    }}static inline void_g_list_free_1 (GList *list){  if (list)    {      list->data = NULL;  #ifdef ENABLE_GC_FRIENDLY      list->prev = NULL;  #endif /* ENABLE_GC_FRIENDLY */      G_LOCK (current_allocator);      list->next = current_allocator->free_lists;      current_allocator->free_lists = list;      G_UNLOCK (current_allocator);    }}voidg_list_free_1 (GList *list){  _g_list_free_1 (list);}#else /* DISABLE_MEM_POOLS */#define _g_list_alloc g_list_allocGList*g_list_alloc (void){  GList *list;    list = g_new0 (GList, 1);    return list;}voidg_list_free (GList *list){  GList *last;    while (list)    {      last = list;      list = list->next;      g_free (last);    }}#define _g_list_free_1 g_list_free_1voidg_list_free_1 (GList *list){  g_free (list);}#endifGList*g_list_append (GList	*list,	       gpointer	 data){  GList *new_list;  GList *last;    new_list = _g_list_alloc ();  new_list->data = data;    if (list)    {      last = g_list_last (list);      /* g_assert (last != NULL); */      last->next = new_list;      new_list->prev = last;      return list;    }  else    return new_list;}GList*g_list_prepend (GList	 *list,		gpointer  data){  GList *new_list;    new_list = _g_list_alloc ();  new_list->data = data;    if (list)    {      if (list->prev)	{	  list->prev->next = new_list;	  new_list->prev = list->prev;	}      list->prev = new_list;      new_list->next = list;    }    return new_list;}GList*g_list_insert (GList	*list,	       gpointer	 data,	       gint	 position){  GList *new_list;  GList *tmp_list;    if (position < 0)    return g_list_append (list, data);  else if (position == 0)    return g_list_prepend (list, data);    tmp_list = g_list_nth (list, position);  if (!tmp_list)    return g_list_append (list, data);    new_list = _g_list_alloc ();  new_list->data = data;    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;}GList*g_list_insert_before (GList   *list,		      GList   *sibling,		      gpointer data){  if (!list)    {      list = g_list_alloc ();      list->data = data;      g_return_val_if_fail (sibling == NULL, list);      return list;    }  else if (sibling)    {      GList *node;      node = g_list_alloc ();      node->data = data;      if (sibling->prev)	{	  node->prev = sibling->prev;	  node->prev->next = node;	  node->next = sibling;	  sibling->prev = node;	  return list;	}      else	{	  node->next = sibling;	  sibling->prev = node;	  g_return_val_if_fail (sibling == list, node);	  return node;	}    }  else    {      GList *last;      last = list;      while (last->next)	last = last->next;      last->next = g_list_alloc ();      last->next->data = data;      last->next->prev = last;      return list;    }}GList *g_list_concat (GList *list1, GList *list2){  GList *tmp_list;    if (list2)    {      tmp_list = g_list_last (list1);      if (tmp_list)	tmp_list->next = list2;      else	list1 = list2;      list2->prev = tmp_list;    }    return list1;}GList*g_list_remove (GList	     *list,	       gconstpointer  data){  GList *tmp;    tmp = list;  while (tmp)    {      if (tmp->data != data)	tmp = tmp->next;      else	{	  if (tmp->prev)	    tmp->prev->next = tmp->next;	  if (tmp->next)	    tmp->next->prev = tmp->prev;	  	  if (list == tmp)	    list = list->next;	  	  _g_list_free_1 (tmp);	  	  break;	}    }  return list;}GList*g_list_remove_all (GList	*list,		   gconstpointer data){  GList *tmp = list;  while (tmp)    {      if (tmp->data != data)	tmp = tmp->next;      else	{	  GList *next = tmp->next;	  if (tmp->prev)	    tmp->prev->next = next;	  else	    list = next;	  if (next)	    next->prev = tmp->prev;	  _g_list_free_1 (tmp);	  tmp = next;

⌨️ 快捷键说明

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