/* -*- 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) 2003-2004 Dodji Seketeli.  All Rights Reserved.
 *
 * 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
 * 
 * Author: Dodji Seketeli
 */

#include <stdio.h>
#include "cr-utils.h"
#include "cr-term.h"
#include "cr-selector.h"
#include "cr-declaration.h"

#ifndef __CR_STATEMENT_H__
#define __CR_STATEMENT_H__

G_BEGIN_DECLS

/**
 *@file
 *Declaration of the #CRStatement class.
 */

/*
 *forward declaration of CRStyleSheet which is defined in
 *cr-stylesheet.h
 */

struct _CRStatement ;

/*
 *typedef struct _CRStatement CRStatement ; 
 *this is forward declared in 
 *cr-declaration.h already.
 */

struct _CRAtMediaRule ;
typedef struct _CRAtMediaRule CRAtMediaRule ;

typedef struct _CRRuleSet CRRuleSet ;

/**
 *The abstraction of a css ruleset.
 *A ruleset is made of a list of selectors,
 *followed by a list of declarations.
 */
struct _CRRuleSet
{
	/**A list of instances of #CRSimpeSel*/
	CRSelector *sel_list ;

	/**A list of instances of #CRDeclaration*/
	CRDeclaration *decl_list ;
	
	/**
	 *The parent media rule, or NULL if
	 *no parent media rule exists.
	 */
	CRStatement *parent_media_rule ;
} ;

/*
 *a forward declaration of CRStylesheet.
 *CRStylesheet is actually declared in
 *cr-stylesheet.h
 */
struct _CRStyleSheet ;
typedef struct _CRStyleSheet CRStyleSheet;


/**The \@import rule abstraction.*/
typedef struct _CRAtImportRule CRAtImportRule ;
struct _CRAtImportRule
{
	/**the url of the import rule*/
	CRString *url ;

        GList *media_list ;

	/**
	 *the stylesheet fetched from the url, if any.
	 *this is not "owned" by #CRAtImportRule which means
	 *it is not destroyed by the destructor of #CRAtImportRule.
	 */
	CRStyleSheet * sheet;
};


/**abstraction of an \@media rule*/
struct _CRAtMediaRule
{
	GList *media_list ;
	CRStatement *rulesets ;	
} ;


typedef struct _CRAtPageRule CRAtPageRule ;
/**The \@page rule abstraction*/
struct _CRAtPageRule
{
	/**a list of instances of #CRDeclaration*/
	CRDeclaration *decl_list ;

	/**page selector. Is a pseudo selector*/
	CRString *name ;
	CRString *pseudo ;
} ;

/**The \@charset rule abstraction*/
typedef struct _CRAtCharsetRule CRAtCharsetRule ;
struct _CRAtCharsetRule
{
	CRString * charset ;
};

/**The abstaction of the \@font-face rule.*/
typedef struct _CRAtFontFaceRule CRAtFontFaceRule ;
struct _CRAtFontFaceRule
{
	/*a list of instanaces of #CRDeclaration*/
	CRDeclaration *decl_list ;
} ;


/**
 *The possible types of css2 statements.
 */
enum CRStatementType
{
	/**
	 *A generic css at-rule
	 *each unknown at-rule will
	 *be of this type.
	 */

        /**A css at-rule*/
	AT_RULE_STMT = 0,

	/*A css ruleset*/
	RULESET_STMT,

	/**A css2 import rule*/
	AT_IMPORT_RULE_STMT,

	/**A css2 media rule*/
	AT_MEDIA_RULE_STMT,

	/**A css2 page rule*/
	AT_PAGE_RULE_STMT,

	/**A css2 charset rule*/
	AT_CHARSET_RULE_STMT,

	/**A css2 font face rule*/
	AT_FONT_FACE_RULE_STMT
} ;


/**
 *The abstraction of css statement as defined
 *in the chapter 4 and appendix D.1 of the css2 spec.
 *A statement is actually a double chained list of
 *statements.A statement can be a ruleset, an \@import
 *rule, an \@page rule etc ...
 */
struct _CRStatement
{
	/**
	 *The type of the statement.
	 */
	enum CRStatementType type ;

	union
	{
		CRRuleSet *ruleset ;
		CRAtImportRule *import_rule ;
		CRAtMediaRule *media_rule ;
		CRAtPageRule *page_rule ;
		CRAtCharsetRule *charset_rule ;
		CRAtFontFaceRule *font_face_rule ;
	} kind ;

        /*
         *the specificity of the selector
         *that matched this statement.
         *This is only used by the cascading
         *order determination algorithm.
         */
        gulong specificity ;

        /*
         *the style sheet that contains
         *this css statement.
         */
        CRStyleSheet *parent_sheet ;
	CRStatement *next ;
	CRStatement *prev ;

        CRParsingLocation location ;

        /**
         *a custom pointer useable by
         *applications that use libcroco.
         *libcroco itself will never modify
         *this pointer.
         */        
        gpointer app_data ;

        /**
         *a custom pointer used
         *by the upper layers of libcroco.
         *application should never use this
         *pointer.
         */
        gpointer croco_data ;

} ;


gboolean
cr_statement_does_buf_parses_against_core (const guchar *a_buf,
                                           enum CREncoding a_encoding) ;
CRStatement *
cr_statement_parse_from_buf (const guchar *a_buf,
			     enum CREncoding a_encoding) ;
CRStatement*
cr_statement_new_ruleset (CRStyleSheet *a_sheet,
                          CRSelector *a_sel_list, 
			  CRDeclaration *a_decl_list,
			  CRStatement *a_media_rule) ;
CRStatement *
cr_statement_ruleset_parse_from_buf (const guchar * a_buf,
				     enum CREncoding a_enc) ;

CRStatement*
cr_statement_new_at_import_rule (CRStyleSheet *a_container_sheet,
                                 CRString *a_url,
                                 GList *a_media_list,
				 CRStyleSheet *a_imported_sheet) ;

CRStatement *
cr_statement_at_import_rule_parse_from_buf (const guchar * a_buf,
                                            enum CREncoding a_encoding) ;

CRStatement *
cr_statement_new_at_media_rule (CRStyleSheet *a_sheet,
                                CRStatement *a_ruleset,
				GList *a_media) ;
CRStatement *
cr_statement_at_media_rule_parse_from_buf (const guchar *a_buf,
					   enum CREncoding a_enc) ;

CRStatement *
cr_statement_new_at_charset_rule (CRStyleSheet *a_sheet,
                                  CRString *a_charset) ;
CRStatement *
cr_statement_at_charset_rule_parse_from_buf (const guchar *a_buf,
					     enum CREncoding a_encoding);


CRStatement *
cr_statement_new_at_font_face_rule (CRStyleSheet *a_sheet,
                                    CRDeclaration *a_font_decls) ;
CRStatement *
cr_statement_font_face_rule_parse_from_buf (const guchar *a_buf,
					    enum CREncoding a_encoding) ;

CRStatement *
cr_statement_new_at_page_rule (CRStyleSheet *a_sheet,
                               CRDeclaration *a_decl_list,
			       CRString *a_name,
			       CRString *a_pseudo) ;
CRStatement *
cr_statement_at_page_rule_parse_from_buf (const guchar *a_buf,
					  enum CREncoding a_encoding)  ;

enum CRStatus
cr_statement_set_parent_sheet (CRStatement *a_this, 
                               CRStyleSheet *a_sheet) ;

enum CRStatus
cr_statement_get_parent_sheet (CRStatement *a_this, 
                               CRStyleSheet **a_sheet) ;

CRStatement *
cr_statement_append (CRStatement *a_this,
		     CRStatement *a_new) ;

CRStatement*
cr_statement_prepend (CRStatement *a_this,
		      CRStatement *a_new) ;

CRStatement *
cr_statement_unlink (CRStatement *a_stmt) ;

enum CRStatus
cr_statement_ruleset_set_sel_list (CRStatement *a_this,
				   CRSelector *a_sel_list) ;

enum CRStatus
cr_statement_ruleset_get_sel_list (CRStatement const *a_this,
				   CRSelector **a_list) ;

enum CRStatus
cr_statement_ruleset_set_decl_list (CRStatement *a_this,
				    CRDeclaration *a_list) ;

enum CRStatus
cr_statement_ruleset_get_declarations (CRStatement *a_this,
                                       CRDeclaration **a_decl_list) ;

enum CRStatus
cr_statement_ruleset_append_decl2 (CRStatement *a_this,
				   CRString *a_prop, CRTerm *a_value) ;

enum CRStatus
cr_statement_ruleset_append_decl (CRStatement *a_this,
				  CRDeclaration *a_decl) ;

enum CRStatus
cr_statement_at_import_rule_set_imported_sheet (CRStatement *a_this,
                                                CRStyleSheet *a_sheet) ;

enum CRStatus
cr_statement_at_import_rule_get_imported_sheet (CRStatement *a_this,
                                                CRStyleSheet **a_sheet) ;

enum CRStatus
cr_statement_at_import_rule_set_url (CRStatement *a_this,
				     CRString *a_url) ;

enum CRStatus
cr_statement_at_import_rule_get_url (CRStatement const *a_this,
				     CRString **a_url) ;

gint
cr_statement_at_media_nr_rules (CRStatement const *a_this) ;

CRStatement *
cr_statement_at_media_get_from_list (CRStatement *a_this, int itemnr) ;

enum CRStatus
cr_statement_at_page_rule_set_sel (CRStatement *a_this,
				   CRSelector *a_sel) ;

enum CRStatus
cr_statement_at_page_rule_get_sel (CRStatement const *a_this,
				   CRSelector **a_sel) ;

enum CRStatus
cr_statement_at_page_rule_set_declarations (CRStatement *a_this,
					    CRDeclaration *a_decl_list) ;

enum CRStatus
cr_statement_at_page_rule_get_declarations (CRStatement *a_this,
					    CRDeclaration **a_decl_list) ;

enum CRStatus
cr_statement_at_charset_rule_set_charset (CRStatement *a_this,
					  CRString *a_charset) ;

enum CRStatus
cr_statement_at_charset_rule_get_charset (CRStatement const *a_this,
					  CRString **a_charset) ;

enum CRStatus
cr_statement_at_font_face_rule_set_decls (CRStatement *a_this,
					  CRDeclaration *a_decls) ;

enum CRStatus
cr_statement_at_font_face_rule_get_decls (CRStatement *a_this,
					  CRDeclaration **a_decls) ;

enum CRStatus
cr_statement_at_font_face_rule_add_decl (CRStatement *a_this,
					 CRString *a_prop,
					 CRTerm *a_value) ;

gchar *
cr_statement_to_string (CRStatement const * a_this, gulong a_indent) ;

gchar*
cr_statement_list_to_string (CRStatement const *a_this, gulong a_indent) ;

void
cr_statement_dump (CRStatement const *a_this, FILE *a_fp, gulong a_indent) ;

void
cr_statement_dump_ruleset (CRStatement const * a_this, FILE * a_fp,
                           glong a_indent) ;

void
cr_statement_dump_font_face_rule (CRStatement const * a_this,
                                  FILE * a_fp,
                                  glong a_indent) ;

void
cr_statement_dump_page (CRStatement const * a_this, FILE * a_fp,
                        gulong a_indent) ;


void
cr_statement_dump_media_rule (CRStatement const * a_this,
                              FILE * a_fp,
                              gulong a_indent) ;

void
cr_statement_dump_import_rule (CRStatement const * a_this, FILE * a_fp,
                               gulong a_indent) ; 
void
cr_statement_dump_charset (CRStatement const * a_this, FILE * a_fp,
                           gulong a_indent) ;
gint
cr_statement_nr_rules (CRStatement const *a_this) ;

CRStatement *
cr_statement_get_from_list (CRStatement *a_this, int itemnr) ;

void
cr_statement_destroy (CRStatement *a_this) ;

G_END_DECLS

#endif /*__CR_STATEMENT_H__*/
