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-attr-sel.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-attr-sel.c')
-rw-r--r-- | src/cr-attr-sel.c | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/src/cr-attr-sel.c b/src/cr-attr-sel.c new file mode 100644 index 0000000..9c1f2e6 --- /dev/null +++ b/src/cr-attr-sel.c @@ -0,0 +1,239 @@ +/* -*- Mode: C; indent-tabs-mode:nil; 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 <stdio.h> +#include "cr-attr-sel.h" + +/** + *@file + *The class that abstracts an attribute selector. + *Attributes selectors are described in the css2 spec [5.8]. + *There are more generally used in the css2 selectors described in + *css2 spec [5] . + */ + + +/** + *The constructor of #CRAttrSel. + *@return the newly allocated instance + *of #CRAttrSel. + */ +CRAttrSel * +cr_attr_sel_new (void) +{ + CRAttrSel *result = NULL ; + result = g_malloc0 (sizeof (CRAttrSel)) ; + + return result ; +} + +/** + *Appends an attribute selector to the current list of + *attribute selectors represented by a_this. + * + *@param a_this the this pointer of the current instance of + *#CRAttrSel. + *@param a_attr_sel selector to append. + *@return CR_OK upon successfull completion, an error code otherwise. + */ +enum CRStatus +cr_attr_sel_append_attr_sel (CRAttrSel *a_this, CRAttrSel *a_attr_sel) +{ + CRAttrSel * cur_sel = NULL ; + + g_return_val_if_fail (a_this && a_attr_sel, + CR_BAD_PARAM_ERROR) ; + + for (cur_sel = a_this ; cur_sel->next ; cur_sel = cur_sel->next) ; + + cur_sel->next = a_attr_sel ; + a_attr_sel->prev = cur_sel ; + + return CR_OK ; +} + +/** + *Prepends an attribute selector to the list of + *attributes selector represented by a_this. + * + *@param a_this the "this pointer" of the current instance + *of #CRAttrSel. + *@param a_attr_sel the attribute selector to append. + *@return CR_OK upon successfull completion, an error code otherwise. + */ +enum CRStatus +cr_attr_sel_prepend_attr_sel (CRAttrSel *a_this, CRAttrSel *a_attr_sel) +{ + g_return_val_if_fail (a_this && a_attr_sel, CR_BAD_PARAM_ERROR); + + a_attr_sel->next = a_this ; + a_this->prev = a_attr_sel ; + + return CR_OK ; +} + +guchar * +cr_attr_sel_to_string (CRAttrSel *a_this) +{ + CRAttrSel *cur = NULL ; + guchar * result = NULL ; + GString *str_buf = NULL ; + + g_return_val_if_fail (a_this, NULL) ; + + str_buf = g_string_new (NULL) ; + + for (cur = a_this ; cur ; cur = cur->next) + { + if (cur->prev) + { + g_string_append_printf (str_buf," ") ; + } + + if (cur->name) + { + guchar *name = NULL ; + + name = g_strndup (cur->name->str, + cur->name->len) ; + if (name) + { + g_string_append_printf (str_buf, + "%s", name) ; + g_free (name) ; + name = NULL ; + } + } + + if (cur->value) + { + guchar *value = NULL ; + + value = g_strndup (cur->value->str, + cur->value->len) ; + if (value) + { + switch (cur->match_way) + { + case SET: + break ; + + case EQUALS: + g_string_append_printf + (str_buf,"=") ; + break ; + + case INCLUDES: + g_string_append_printf + (str_buf,"~=") ; + break ; + + case DASHMATCH: + g_string_append_printf + (str_buf,"|=") ; + break ; + + default: + break ; + } + + g_string_append_printf + (str_buf,"\"%s\"",value) ; + + g_free (value) ; + value = NULL ; + } + } + } + + if (str_buf) + { + result = str_buf->str ; + g_string_free (str_buf, FALSE) ; + } + + return result ; +} + +/** + *Dumps the current instance of #CRAttrSel to a file. + *@param a_this the "this pointer" of the current instance of + *#CRAttrSel. + *@param a_fp the destination file. + */ +void +cr_attr_sel_dump (CRAttrSel *a_this, FILE *a_fp) +{ + guchar * tmp_str = NULL ; + + g_return_if_fail (a_this) ; + + tmp_str = cr_attr_sel_to_string (a_this) ; + + if (tmp_str) + { + fprintf (a_fp, "%s", tmp_str) ; + g_free (tmp_str) ; + tmp_str = NULL ; + } +} + + +/** + *Destroys the current instance of #CRAttrSel. + *Frees all the fields if they are non null. + *@param a_this the "this pointer" of the current + *instance of #CRAttrSel. + */ +void +cr_attr_sel_destroy (CRAttrSel *a_this) +{ + g_return_if_fail (a_this) ; + + if (a_this->name) + { + g_string_free (a_this->name, TRUE) ; + a_this->name = NULL ; + } + + if (a_this->value) + { + g_string_free (a_this->value, TRUE) ; + a_this->value = NULL ; + } + + if (a_this->next) + { + cr_attr_sel_destroy (a_this->next) ; + a_this->next = NULL ; + } + + if (a_this) + { + g_free (a_this) ; + a_this = NULL ; + } +} |