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

📄 gnode.c

📁 嵌入式下基于MiniGUI的Web Browser
💻 C
📖 第 1 页 / 共 2 页
字号:
	  child = current->next;	  if (g_node_depth_traverse_pre_order (current, flags, depth, func, data))	    return TRUE;	}    }  else if ((flags & G_TRAVERSE_LEAFS) &&	   func (node, data))    return TRUE;    return FALSE;}static gbooleang_node_traverse_post_order (GNode	     *node,			    GTraverseFlags    flags,			    GNodeTraverseFunc func,			    gpointer	      data){  if (node->children)    {      GNode *child;            child = node->children;      while (child)	{	  register GNode *current;	  	  current = child;	  child = current->next;	  if (g_node_traverse_post_order (current, flags, func, data))	    return TRUE;	}            if ((flags & G_TRAVERSE_NON_LEAFS) &&	  func (node, data))	return TRUE;          }  else if ((flags & G_TRAVERSE_LEAFS) &&	   func (node, data))    return TRUE;    return FALSE;}static gbooleang_node_depth_traverse_post_order (GNode		   *node,				  GTraverseFlags    flags,				  guint		    depth,				  GNodeTraverseFunc func,				  gpointer	    data){  if (node->children)    {      depth--;      if (depth)	{	  GNode *child;	  	  child = node->children;	  while (child)	    {	      register GNode *current;	      	      current = child;	      child = current->next;	      if (g_node_depth_traverse_post_order (current, flags, depth, func, data))		return TRUE;	    }	}            if ((flags & G_TRAVERSE_NON_LEAFS) &&	  func (node, data))	return TRUE;          }  else if ((flags & G_TRAVERSE_LEAFS) &&	   func (node, data))    return TRUE;    return FALSE;}static gbooleang_node_traverse_in_order (GNode		   *node,			  GTraverseFlags    flags,			  GNodeTraverseFunc func,			  gpointer	    data){  if (node->children)    {      GNode *child;      register GNode *current;            child = node->children;      current = child;      child = current->next;            if (g_node_traverse_in_order (current, flags, func, data))	return TRUE;            if ((flags & G_TRAVERSE_NON_LEAFS) &&	  func (node, data))	return TRUE;            while (child)	{	  current = child;	  child = current->next;	  if (g_node_traverse_in_order (current, flags, func, data))	    return TRUE;	}    }  else if ((flags & G_TRAVERSE_LEAFS) &&	   func (node, data))    return TRUE;    return FALSE;}static gbooleang_node_depth_traverse_in_order (GNode		 *node,				GTraverseFlags	  flags,				guint		  depth,				GNodeTraverseFunc func,				gpointer	  data){  if (node->children)    {      depth--;      if (depth)	{	  GNode *child;	  register GNode *current;	  	  child = node->children;	  current = child;	  child = current->next;	  	  if (g_node_depth_traverse_in_order (current, flags, depth, func, data))	    return TRUE;	  	  if ((flags & G_TRAVERSE_NON_LEAFS) &&	      func (node, data))	    return TRUE;	  	  while (child)	    {	      current = child;	      child = current->next;	      if (g_node_depth_traverse_in_order (current, flags, depth, func, data))		return TRUE;	    }	}      else if ((flags & G_TRAVERSE_NON_LEAFS) &&	       func (node, data))	return TRUE;    }  else if ((flags & G_TRAVERSE_LEAFS) &&	   func (node, data))    return TRUE;    return FALSE;}static gbooleang_node_traverse_level (GNode		 *node,		       GTraverseFlags	  flags,		       guint		  level,		       GNodeTraverseFunc func,		       gpointer	  data,		       gboolean         *more_levels){  if (level == 0)     {      if (node->children)	{	  *more_levels = TRUE;	  return (flags & G_TRAVERSE_NON_LEAFS) && func (node, data);	}      else	{	  return (flags & G_TRAVERSE_LEAFS) && func (node, data);	}    }  else     {      node = node->children;            while (node)	{	  if (g_node_traverse_level (node, flags, level - 1, func, data, more_levels))	    return TRUE;	  node = node->next;	}    }  return FALSE;}static gbooleang_node_depth_traverse_level (GNode		 *node,			     GTraverseFlags	  flags,			     guint		  depth,			     GNodeTraverseFunc func,			     gpointer	  data){  gint level;  gboolean more_levels;  level = 0;    while (level != depth)     {      more_levels = FALSE;      if (g_node_traverse_level (node, flags, level, func, data, &more_levels))	return TRUE;      if (!more_levels)	break;      level++;    }  return FALSE;}voidg_node_traverse (GNode		  *root,		 GTraverseType	   order,		 GTraverseFlags	   flags,		 gint		   depth,		 GNodeTraverseFunc func,		 gpointer	   data){  g_return_if_fail (root != NULL);  g_return_if_fail (func != NULL);  g_return_if_fail (order <= G_LEVEL_ORDER);  g_return_if_fail (flags <= G_TRAVERSE_MASK);  g_return_if_fail (depth == -1 || depth > 0);    switch (order)    {    case G_PRE_ORDER:      if (depth < 0)	g_node_traverse_pre_order (root, flags, func, data);      else	g_node_depth_traverse_pre_order (root, flags, depth, func, data);      break;    case G_POST_ORDER:      if (depth < 0)	g_node_traverse_post_order (root, flags, func, data);      else	g_node_depth_traverse_post_order (root, flags, depth, func, data);      break;    case G_IN_ORDER:      if (depth < 0)	g_node_traverse_in_order (root, flags, func, data);      else	g_node_depth_traverse_in_order (root, flags, depth, func, data);      break;    case G_LEVEL_ORDER:      g_node_depth_traverse_level (root, flags, depth, func, data);      break;    }}static gbooleang_node_find_func (GNode	  *node,		  gpointer data){  register gpointer *d = data;    if (*d != node->data)    return FALSE;    *(++d) = node;    return TRUE;}GNode*g_node_find (GNode	       *root,	     GTraverseType	order,	     GTraverseFlags	flags,	     gpointer		data){  gpointer d[2];    g_return_val_if_fail (root != NULL, NULL);  g_return_val_if_fail (order <= G_LEVEL_ORDER, NULL);  g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL);    d[0] = data;  d[1] = NULL;    g_node_traverse (root, order, flags, -1, g_node_find_func, d);    return d[1];}static voidg_node_count_func (GNode	 *node,		   GTraverseFlags flags,		   guint	 *n){  if (node->children)    {      GNode *child;            if (flags & G_TRAVERSE_NON_LEAFS)	(*n)++;            child = node->children;      while (child)	{	  g_node_count_func (child, flags, n);	  child = child->next;	}    }  else if (flags & G_TRAVERSE_LEAFS)    (*n)++;}guintg_node_n_nodes (GNode	      *root,		GTraverseFlags flags){  guint n = 0;    g_return_val_if_fail (root != NULL, 0);  g_return_val_if_fail (flags <= G_TRAVERSE_MASK, 0);    g_node_count_func (root, flags, &n);    return n;}GNode*g_node_last_child (GNode *node){  g_return_val_if_fail (node != NULL, NULL);    node = node->children;  if (node)    while (node->next)      node = node->next;    return node;}GNode*g_node_nth_child (GNode *node,		  guint	 n){  g_return_val_if_fail (node != NULL, NULL);    node = node->children;  if (node)    while ((n-- > 0) && node)      node = node->next;    return node;}guintg_node_n_children (GNode *node){  guint n = 0;    g_return_val_if_fail (node != NULL, 0);    node = node->children;  while (node)    {      n++;      node = node->next;    }    return n;}GNode*g_node_find_child (GNode	 *node,		   GTraverseFlags flags,		   gpointer	  data){  g_return_val_if_fail (node != NULL, NULL);  g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL);    node = node->children;  while (node)    {      if (node->data == data)	{	  if (G_NODE_IS_LEAF (node))	    {	      if (flags & G_TRAVERSE_LEAFS)		return node;	    }	  else	    {	      if (flags & G_TRAVERSE_NON_LEAFS)		return node;	    }	}      node = node->next;    }    return NULL;}gintg_node_child_position (GNode *node,		       GNode *child){  register guint n = 0;    g_return_val_if_fail (node != NULL, -1);  g_return_val_if_fail (child != NULL, -1);  g_return_val_if_fail (child->parent == node, -1);    node = node->children;  while (node)    {      if (node == child)	return n;      n++;      node = node->next;    }    return -1;}gintg_node_child_index (GNode   *node,		    gpointer data){  register guint n = 0;    g_return_val_if_fail (node != NULL, -1);    node = node->children;  while (node)    {      if (node->data == data)	return n;      n++;      node = node->next;    }    return -1;}GNode*g_node_first_sibling (GNode *node){  g_return_val_if_fail (node != NULL, NULL);    if (node->parent)    return node->parent->children;    while (node->prev)    node = node->prev;    return node;}GNode*g_node_last_sibling (GNode *node){  g_return_val_if_fail (node != NULL, NULL);    while (node->next)    node = node->next;    return node;}voidg_node_children_foreach (GNode		 *node,			 GTraverseFlags	  flags,			 GNodeForeachFunc func,			 gpointer	  data){  g_return_if_fail (node != NULL);  g_return_if_fail (flags <= G_TRAVERSE_MASK);  g_return_if_fail (func != NULL);    node = node->children;  while (node)    {      register GNode *current;            current = node;      node = current->next;      if (G_NODE_IS_LEAF (current))	{	  if (flags & G_TRAVERSE_LEAFS)	    func (current, data);	}      else	{	  if (flags & G_TRAVERSE_NON_LEAFS)	    func (current, data);	}    }}

⌨️ 快捷键说明

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