(root)/
gettext-0.22.4/
libtextstyle/
lib/
libcroco/
cr-stylesheet.c
       1  /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
       2  
       3  /* libcroco - Library for parsing and applying CSS
       4   * Copyright (C) 2006-2019 Free Software Foundation, Inc.
       5   *
       6   * This file is not part of the GNU gettext program, but is used with
       7   * GNU gettext.
       8   *
       9   * The original copyright notice is as follows:
      10   */
      11  
      12  /*
      13   * This file is part of The Croco Library
      14   *
      15   * Copyright (C) 2002-2004 Dodji Seketeli
      16   *
      17   * This program is free software; you can redistribute it and/or
      18   * modify it under the terms of version 2.1 of the GNU Lesser General Public
      19   * License as published by the Free Software Foundation.
      20   *
      21   * This program is distributed in the hope that it will be useful,
      22   * but WITHOUT ANY WARRANTY; without even the implied warranty of
      23   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      24   * GNU General Public License for more details.
      25   *
      26   * You should have received a copy of the GNU Lesser General Public License
      27   * along with this program; if not, write to the Free Software
      28   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
      29   * USA
      30   */
      31  
      32  #include <config.h>
      33  #include "string.h"
      34  #include "cr-stylesheet.h"
      35  
      36  /**
      37   *@file
      38   *The definition of the #CRStyleSheet class
      39   */
      40  
      41  /**
      42   *Constructor of the #CRStyleSheet class.
      43   *@param the initial list of css statements.
      44   *@return the newly built css2 stylesheet, or NULL in case of error.
      45   */
      46  CRStyleSheet *
      47  cr_stylesheet_new (CRStatement * a_stmts)
      48  {
      49          CRStyleSheet *result;
      50  
      51          result = g_try_malloc (sizeof (CRStyleSheet));
      52          if (!result) {
      53                  cr_utils_trace_info ("Out of memory");
      54                  return NULL;
      55          }
      56  
      57          memset (result, 0, sizeof (CRStyleSheet));
      58  
      59          if (a_stmts)
      60                  result->statements = a_stmts;
      61  
      62          return result;
      63  }
      64  
      65  /**
      66   *@param a_this the current instance of #CRStyleSheet
      67   *@return the serialized stylesheet.
      68   */
      69  gchar *
      70  cr_stylesheet_to_string (CRStyleSheet const *a_this)
      71  {
      72  	gchar *str = NULL;
      73  	GString *stringue = NULL;
      74  	CRStatement const *cur_stmt = NULL;
      75  
      76          g_return_val_if_fail (a_this, NULL);
      77  
      78  	if (a_this->statements) {
      79  		stringue = g_string_new (NULL) ;
      80  		g_return_val_if_fail (stringue, NULL) ;
      81  	}
      82          for (cur_stmt = a_this->statements;
      83               cur_stmt; cur_stmt = cur_stmt->next) {
      84  		if (cur_stmt->prev) {
      85  			g_string_append (stringue, "\n\n") ;
      86  		}
      87  		str = cr_statement_to_string (cur_stmt, 0) ;
      88  		if (str) {
      89  			g_string_append (stringue, str) ;
      90  			g_free (str) ;
      91  			str = NULL ;
      92  		}
      93          }
      94  	if (stringue) {
      95  		str = stringue->str ;
      96  		g_string_free (stringue, FALSE) ;
      97  		stringue = NULL ;
      98  	}
      99  	return str ;
     100  }
     101  
     102  /**
     103   *Dumps the current css2 stylesheet to a file.
     104   *@param a_this the current instance of #CRStyleSheet.
     105   *@param a_fp the destination file
     106   */
     107  void
     108  cr_stylesheet_dump (CRStyleSheet const * a_this, FILE * a_fp)
     109  {
     110  	gchar *str = NULL ;
     111  
     112          g_return_if_fail (a_this);
     113  
     114  	str = cr_stylesheet_to_string (a_this) ;
     115  	if (str) {
     116  		fprintf (a_fp, "%s", str) ;
     117  		g_free (str) ;
     118  		str = NULL ;
     119  	}
     120  }
     121  
     122  /**
     123   *Return the number of rules in the stylesheet.
     124   *@param a_this the current instance of #CRStyleSheet.
     125   *@return number of rules in the stylesheet.
     126   */
     127  gint
     128  cr_stylesheet_nr_rules (CRStyleSheet const * a_this)
     129  {
     130          g_return_val_if_fail (a_this, -1);
     131  
     132          return cr_statement_nr_rules (a_this->statements);
     133  }
     134  
     135  /**
     136   *Use an index to get a CRStatement from the rules in a given stylesheet.
     137   *@param a_this the current instance of #CRStatement.
     138   *@param itemnr the index into the rules.
     139   *@return CRStatement at position itemnr, if itemnr > number of rules - 1,
     140   *it will return NULL.
     141   */
     142  CRStatement *
     143  cr_stylesheet_statement_get_from_list (CRStyleSheet * a_this, int itemnr)
     144  {
     145          g_return_val_if_fail (a_this, NULL);
     146  
     147          return cr_statement_get_from_list (a_this->statements, itemnr);
     148  }
     149  
     150  void
     151  cr_stylesheet_ref (CRStyleSheet * a_this)
     152  {
     153          g_return_if_fail (a_this);
     154  
     155          a_this->ref_count++;
     156  }
     157  
     158  gboolean
     159  cr_stylesheet_unref (CRStyleSheet * a_this)
     160  {
     161          g_return_val_if_fail (a_this, FALSE);
     162  
     163          if (a_this->ref_count)
     164                  a_this->ref_count--;
     165  
     166          if (!a_this->ref_count) {
     167                  cr_stylesheet_destroy (a_this);
     168                  return TRUE;
     169          }
     170  
     171          return FALSE;
     172  }
     173  
     174  /**
     175   *Destructor of the #CRStyleSheet class.
     176   *@param a_this the current instance of the #CRStyleSheet class.
     177   */
     178  void
     179  cr_stylesheet_destroy (CRStyleSheet * a_this)
     180  {
     181          g_return_if_fail (a_this);
     182  
     183          if (a_this->statements) {
     184                  cr_statement_destroy (a_this->statements);
     185                  a_this->statements = NULL;
     186          }
     187          g_free (a_this);
     188  }