blob: 1e7579b020e9a08efde65e3caa3529faed16343c [file] [log] [blame]
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
/* libcroco - Library for parsing and applying CSS
* Copyright (C) 2006-2019 Free Software Foundation, Inc.
*
* This file is not part of the GNU gettext program, but is used with
* GNU gettext.
*
* The original copyright notice is as follows:
*/
/*
* This file is part of The Croco Library
*
* Copyright (C) 2002-2004 Dodji Seketeli
*
* 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
*/
#include <config.h>
#include "string.h"
#include "cr-stylesheet.h"
/**
*@file
*The definition of the #CRStyleSheet class
*/
/**
*Constructor of the #CRStyleSheet class.
*@param the initial list of css statements.
*@return the newly built css2 stylesheet, or NULL in case of error.
*/
CRStyleSheet *
cr_stylesheet_new (CRStatement * a_stmts)
{
CRStyleSheet *result;
result = g_try_malloc (sizeof (CRStyleSheet));
if (!result) {
cr_utils_trace_info ("Out of memory");
return NULL;
}
memset (result, 0, sizeof (CRStyleSheet));
if (a_stmts)
result->statements = a_stmts;
return result;
}
/**
*@param a_this the current instance of #CRStyleSheet
*@return the serialized stylesheet.
*/
gchar *
cr_stylesheet_to_string (CRStyleSheet const *a_this)
{
gchar *str = NULL;
GString *stringue = NULL;
CRStatement const *cur_stmt = NULL;
g_return_val_if_fail (a_this, NULL);
if (a_this->statements) {
stringue = g_string_new (NULL) ;
g_return_val_if_fail (stringue, NULL) ;
}
for (cur_stmt = a_this->statements;
cur_stmt; cur_stmt = cur_stmt->next) {
if (cur_stmt->prev) {
g_string_append (stringue, "\n\n") ;
}
str = cr_statement_to_string (cur_stmt, 0) ;
if (str) {
g_string_append (stringue, str) ;
g_free (str) ;
str = NULL ;
}
}
if (stringue) {
str = stringue->str ;
g_string_free (stringue, FALSE) ;
stringue = NULL ;
}
return str ;
}
/**
*Dumps the current css2 stylesheet to a file.
*@param a_this the current instance of #CRStyleSheet.
*@param a_fp the destination file
*/
void
cr_stylesheet_dump (CRStyleSheet const * a_this, FILE * a_fp)
{
gchar *str = NULL ;
g_return_if_fail (a_this);
str = cr_stylesheet_to_string (a_this) ;
if (str) {
fprintf (a_fp, "%s", str) ;
g_free (str) ;
str = NULL ;
}
}
/**
*Return the number of rules in the stylesheet.
*@param a_this the current instance of #CRStyleSheet.
*@return number of rules in the stylesheet.
*/
gint
cr_stylesheet_nr_rules (CRStyleSheet const * a_this)
{
g_return_val_if_fail (a_this, -1);
return cr_statement_nr_rules (a_this->statements);
}
/**
*Use an index to get a CRStatement from the rules in a given stylesheet.
*@param a_this the current instance of #CRStatement.
*@param itemnr the index into the rules.
*@return CRStatement at position itemnr, if itemnr > number of rules - 1,
*it will return NULL.
*/
CRStatement *
cr_stylesheet_statement_get_from_list (CRStyleSheet * a_this, int itemnr)
{
g_return_val_if_fail (a_this, NULL);
return cr_statement_get_from_list (a_this->statements, itemnr);
}
void
cr_stylesheet_ref (CRStyleSheet * a_this)
{
g_return_if_fail (a_this);
a_this->ref_count++;
}
gboolean
cr_stylesheet_unref (CRStyleSheet * a_this)
{
g_return_val_if_fail (a_this, FALSE);
if (a_this->ref_count)
a_this->ref_count--;
if (!a_this->ref_count) {
cr_stylesheet_destroy (a_this);
return TRUE;
}
return FALSE;
}
/**
*Destructor of the #CRStyleSheet class.
*@param a_this the current instance of the #CRStyleSheet class.
*/
void
cr_stylesheet_destroy (CRStyleSheet * a_this)
{
g_return_if_fail (a_this);
if (a_this->statements) {
cr_statement_destroy (a_this->statements);
a_this->statements = NULL;
}
g_free (a_this);
}