diff options
author | Dodji Seketeli <dodji@gnome.org> | 2004-01-24 19:24:08 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@src.gnome.org> | 2004-01-24 19:24:08 +0000 |
commit | d058779c836ec6ac56721581dd44d1dd91d3206c (patch) | |
tree | f371ad9e5150f3526edd528e44f990e9d060014c /src/cr-selector.c | |
parent | a97a943a32d37e1c92aa93e861a28d96f84f2163 (diff) | |
download | libcroco-d058779c836ec6ac56721581dd44d1dd91d3206c.tar.gz |
separated the library into two projects. Libcroco is now the combination
2004-01-24 Dodji Seketeli <dodji@gnome.org>
* all: separated the library into two projects. Libcroco
is now the combination of the parser and the selection engine.
A new project is born: sewfox. It is basically the
xml rendering/layout engine.
Libcroco now needs libxml2 and glib only.
Sewfox need libgnomecanvas2.
Diffstat (limited to 'src/cr-selector.c')
-rw-r--r-- | src/cr-selector.c | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/src/cr-selector.c b/src/cr-selector.c new file mode 100644 index 0000000..be1a069 --- /dev/null +++ b/src/cr-selector.c @@ -0,0 +1,304 @@ +/* -*- Mode: C; indent-tabs-mode: ni; c-basic-offset: 8 -*- */ + +/* + * This file is part of The Croco Library + * + * Copyright (C) 2002-2003 Dodji Seketeli <dodji@seketeli.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2.1 of the GNU Lesser General Public + * License as published by the Free Software Foundation. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +/* + *$Id$ + */ +#include <string.h> +#include "cr-selector.h" +#include "cr-parser.h" + +/** + *Creates a new instance of #CRSelector. + *@param a_simple_sel the initial simple selector list + *of the current instance of #CRSelector. + *@return the newly built instance of #CRSelector, or + *NULL in case of failure. + */ +CRSelector* +cr_selector_new (CRSimpleSel *a_simple_sel) +{ + CRSelector *result = NULL ; + + result = g_try_malloc (sizeof (CRSelector)) ; + if (!result) + { + cr_utils_trace_info ("Out of memory") ; + return NULL ; + } + memset (result, 0, sizeof (CRSelector)) ; + result->simple_sel = a_simple_sel ; + return result ; +} + +CRSelector * +cr_selector_parse_from_buf (const guchar * a_char_buf, + enum CREncoding a_enc) +{ + CRParser * parser = NULL ; + + g_return_val_if_fail (a_char_buf, NULL) ; + + parser = cr_parser_new_from_buf (a_char_buf, strlen (a_char_buf), + a_enc, FALSE) ; + g_return_val_if_fail (parser, NULL) ; + + + return NULL ; +} + +/** + *Appends a new instance of #CRSelector to the current selector list. + *@param a_this the current instance of #CRSelector. + *@param a_new the instance of #CRSelector to be appended. + *@return the new list. + */ +CRSelector* +cr_selector_append (CRSelector *a_this, CRSelector *a_new) +{ + CRSelector *cur = NULL ; + + if (!a_this) + { + return a_new ; + } + + /*walk forward the list headed by a_this to get the list tail*/ + for (cur = a_this ; cur && cur->next ; cur = cur->next) ; + + cur->next = a_new ; + a_new->prev = cur ; + + return a_this ; +} + +/** + *Prepends an element to the #CRSelector list. + *@param a_this the current instance of #CRSelector list. + *@param a_new the instance of #CRSelector. + *@return the new list. + */ +CRSelector* +cr_selector_prepend (CRSelector *a_this, CRSelector *a_new) +{ + CRSelector *cur = NULL ; + + a_new->next = a_this ; + a_this->prev = a_new ; + + for (cur = a_new ; cur && cur->prev ; cur = cur->prev) ; + + return cur ; +} + +/** + *append a simple selector to the current #CRSelector list. + *@param a_this the current instance of #CRSelector. + *@param a_simple_sel the simple selector to append. + *@return the new list or NULL in case of failure. + */ +CRSelector* +cr_selector_append_simple_sel (CRSelector *a_this, CRSimpleSel *a_simple_sel) +{ + CRSelector * selector = NULL ; + + selector = cr_selector_new (a_simple_sel) ; + g_return_val_if_fail (selector, NULL) ; + + return cr_selector_append (a_this, selector) ; +} + + +guchar * +cr_selector_to_string (CRSelector *a_this) +{ + guchar *result = NULL ; + GString *str_buf = NULL ; + + str_buf = g_string_new (NULL) ; + g_return_val_if_fail (str_buf, NULL) ; + + if (a_this) + { + CRSelector *cur = NULL ; + + for (cur = a_this ; cur ; cur = cur->next) + { + if (cur->simple_sel) + { + guchar *tmp_str = NULL ; + + tmp_str = cr_simple_sel_to_string + (cur->simple_sel) ; + + if (tmp_str) + { + if (cur->prev) + g_string_append_printf + (str_buf,", ") ; + + g_string_append_printf + (str_buf, "%s", + tmp_str) ; + + g_free (tmp_str) ; + tmp_str = NULL ; + } + } + } + } + + if (str_buf) + { + result = str_buf->str ; + g_string_free (str_buf, FALSE) ; + str_buf = NULL ; + } + + return result ; +} + + +/** + *Serializes the current instance of #CRSelector to a file. + *@param a_this the current instance of #CRSelector. + *@param a_fp the destination file. + */ +void +cr_selector_dump (CRSelector *a_this, FILE *a_fp) +{ + guchar *tmp_buf = NULL ; + + if (a_this) + { + tmp_buf = cr_selector_to_string (a_this) ; + if (tmp_buf) + { + fprintf (a_fp, "%s", tmp_buf) ; + g_free (tmp_buf) ; + tmp_buf = NULL ; + } + } +} + +/** + *Increments the ref count of the current instance + *of #CRSelector. + *@param a_this the current instance of #CRSelector. + */ +void +cr_selector_ref (CRSelector *a_this) +{ + g_return_if_fail (a_this) ; + + a_this->ref_count ++ ; +} + +/** + *Decrements the ref count of the current instance of + *#CRSelector. + *If the ref count reaches zero, the current instance of + *#CRSelector is destroyed. + *@param a_this the current instance of #CRSelector. + *@return TRUE if this function destroyed the current instance + *of #CRSelector, FALSE otherwise. + */ +gboolean +cr_selector_unref (CRSelector *a_this) +{ + g_return_val_if_fail (a_this, FALSE) ; + + if (a_this->ref_count) + { + a_this->ref_count -- ; + } + + if (a_this->ref_count == 0) + { + cr_selector_destroy (a_this) ; + return TRUE ; + } + + return FALSE ; +} + +/** + *Destroys the selector list. + *@param a_this the current instance of #CRSelector. + */ +void +cr_selector_destroy (CRSelector *a_this) +{ + CRSelector *cur = NULL ; + + g_return_if_fail (a_this) ; + + /* + *go and get the list tail. In the same time, free + *all the simple selectors contained in the list. + */ + for (cur = a_this ;cur && cur->next ; cur = cur->next) + { + if (cur->simple_sel) + { + cr_simple_sel_destroy (cur->simple_sel) ; + cur->simple_sel = NULL ; + } + } + + if (cur) + { + if (cur->simple_sel) + { + cr_simple_sel_destroy (cur->simple_sel) ; + cur->simple_sel = NULL ; + } + } + + /*in case the list has only one element*/ + if (cur && !cur->prev) + { + g_free (cur) ; + return ; + } + + /*walk backward the list and free each "next element"*/ + for (cur = cur->prev ; cur && cur->prev ; cur = cur->prev) + { + if (cur->next) + { + g_free (cur->next) ; + cur->next = NULL ; + } + } + + if (!cur) + return ; + + if (cur->next) + { + g_free (cur->next) ; + cur->next = NULL ; + } + + g_free (cur) ; +} |