LibCSS internal stylesheet representation
=========================================

Selector:

struct selector {
	selector_type type;			/**< Type of selector */

	struct {
		const uint8_t *name;
		size_t name_len;

		const uint8_t *value;
		size_t value_len;
	} data;					/**< Selector data */

	struct selector *specifics;		/**< Selector specifics */

	combinator combinator_type;		/**< Type of combinator */
	struct selector *combinator;		/**< Combining selector */

	struct rule *rule;			/**< Owning rule */

	struct style *style;			/**< Applicable style */

	struct selector *next;			/**< Next selector in list */
	struct selector *prev;			/**< Previous selector */
};

Rule:

struct rule {
	rule_type type;				/**< Type of rule */

	union {
		struct {
			uint32_t selector_count;
			struct selector **selectors;
		} selector;
		struct {
			uint32_t media;
			uint32_t rule_count;
			struct rule **rules;
		} media;
		struct {
			struct style *style;
		} font_face;
		struct {
			uint32_t selector_count;
			struct selector **selectors;
			struct style *style;
		} page;
		struct {
			struct stylesheet *sheet;
		} import;
		struct {
			char *encoding;
		} charset;
	} data;					/**< Rule data */

	uint32_t index;				/**< Index of rule in sheet */

	struct stylesheet *owner;		/**< Owning sheet */

	struct rule *parent;			/**< Parent rule */
	struct rule *first_child;		/**< First in child list */
	struct rule *last_child;		/**< Last in child list */
	struct rule *next;			/**< Next rule */
	struct rule *prev;			/**< Previous rule */
};

Stylesheet:

struct stylesheet {
#define HASH_SIZE (37)
	struct selector *selectors[HASH_SIZE];	/**< Hashtable of selectors */

	uint32_t rule_count;			/**< Number of rules in sheet */
	struct rule *rule_list;			/**< List of rules in sheet */

	bool disabled;				/**< Whether this sheet is
						 * disabled */

	char *url;				/**< URL of this sheet */
	char *title;				/**< Title of this sheet */

	uint32_t media;				/**< Bitfield of media types */

	void *ownerNode;			/**< Owning node in document */
	struct rule *ownerRule;			/**< Owning rule in parent */

	struct stylesheet *parent;		/**< Parent sheet */
	struct stylesheet *first_child;		/**< First in child list */
	struct stylesheet *last_child;		/**< Last in child list */
	struct stylesheet *next;		/**< Next in sibling list */
	struct stylesheet *prev;		/**< Previous in sibling list */
};

