diff options
Diffstat (limited to 'src/cr-token.c')
-rw-r--r-- | src/cr-token.c | 674 |
1 files changed, 674 insertions, 0 deletions
diff --git a/src/cr-token.c b/src/cr-token.c new file mode 100644 index 0000000..8ade6be --- /dev/null +++ b/src/cr-token.c @@ -0,0 +1,674 @@ +/* -*- 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$ + */ + +/** + *@file + *The definition of the #CRToken class. + *Abstracts a css2 token. + */ +#include <string.h> +#include "cr-token.h" + + +/** + *Frees the attributes of the current instance + *of #CRtoken. + *@param a_this the current instance of #CRToken. + */ +static void +cr_token_clear (CRToken *a_this) +{ + g_return_if_fail (a_this) ; + + switch (a_this->type) + { + case S_TK: + case CDO_TK: + case INCLUDES_TK: + case DASHMATCH_TK: + case PAGE_SYM_TK: + case MEDIA_SYM_TK: + case FONT_FACE_SYM_TK: + case CHARSET_SYM_TK: + case IMPORT_SYM_TK: + case IMPORTANT_SYM_TK: + break ; + + case STRING_TK: + case IDENT_TK: + case HASH_TK: + case URI_TK: + case FUNCTION_TK: + case COMMENT_TK: + if (a_this->u.str) + { + g_string_free (a_this->u.str, TRUE) ; + a_this->u.str = NULL ; + } + break ; + + case EMS_TK: + case EXS_TK: + case LENGTH_TK: + case ANGLE_TK: + case TIME_TK: + case FREQ_TK: + case PERCENTAGE_TK: + case NUMBER_TK: + if (a_this->u.num) + { + cr_num_destroy (a_this->u.num) ; + a_this->u.num = NULL ; + } + break ; + + case DIMEN_TK: + if (a_this->u.num) + { + cr_num_destroy (a_this->u.num) ; + a_this->u.num = NULL ; + } + + if (a_this->dimen) + { + g_string_free (a_this->dimen, TRUE) ; + a_this->dimen = NULL ; + } + + break ; + + case UNICODERANGE_TK: + /*not supported yet.*/ + break ; + + default: + break ; + } + + a_this->type = NO_TK ; +} + + +/** + *Default constructor of + *the #CRToken class. + *@return the newly built instance of #CRToken. + */ +CRToken* +cr_token_new (void) +{ + CRToken *result = NULL ; + + result = g_try_malloc (sizeof (CRToken)) ; + + if (result == NULL) + { + cr_utils_trace_info ("Out of memory") ; + return NULL ; + } + + memset (result, 0, sizeof (CRToken)) ; + + return result ; +} + + +/** + *Sets the type of curren instance of + *#CRToken to 'S_TK' (S in the css2 spec) + *@param a_this the current instance of #CRToken. + *@return CR_OK upon successfull completion, an error + *code otherwise. + */ +enum CRStatus +cr_token_set_s (CRToken *a_this) +{ + g_return_val_if_fail (a_this, + CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = S_TK ; + + return CR_OK ; +} + + +/** + *Sets the type of the current instance of + *#CRToken to 'CDO_TK' (CDO as said by the css2 spec) + *@param a_this the current instance of #CRToken. + *@return CR_OK upon successfull completion, an error + *code otherwise. + */ +enum CRStatus +cr_token_set_cdo (CRToken *a_this) +{ + g_return_val_if_fail (a_this, + CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = CDO_TK ; + + return CR_OK ; +} + +/** + *Sets the type of the current token to + *CDC_TK (CDC as said by the css2 spec). + *@param a_this the current instance of #CRToken. + *@return CR_OK upon successfull completion, an error + *code otherwise. + */ +enum CRStatus +cr_token_set_cdc (CRToken *a_this) +{ + g_return_val_if_fail (a_this, + CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = CDC_TK ; + + return CR_OK ; +} + + +/** + *Sets the type of the current instance of + *#CRToken to INCLUDES_TK (INCLUDES as said by the css2 spec). + *@param a_this the current instance of #CRToken. + *@return CR_OK upon successfull completion, an error + *code otherwise. + */ +enum CRStatus +cr_token_set_includes (CRToken *a_this) +{ + g_return_val_if_fail (a_this, + CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = INCLUDES_TK ; + + return CR_OK ; +} + + +/** + *Sets the type of the current instance of + *#CRToken to DASHMATCH_TK (DASHMATCH as said by the css2 spec). + *@param a_this the current instance of #CRToken. + *@return CR_OK upon successfull completion, an error + *code otherwise. + */ +enum CRStatus +cr_token_set_dashmatch (CRToken *a_this) +{ + g_return_val_if_fail (a_this, + CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = DASHMATCH_TK ; + + return CR_OK ; +} + + +enum CRStatus +cr_token_set_comment (CRToken *a_this, GString *a_str) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = COMMENT_TK ; + + a_this->u.str = a_str ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_string (CRToken *a_this, GString *a_str) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = STRING_TK ; + + a_this->u.str = a_str ; + + return CR_OK ; +} + + +enum CRStatus +cr_token_set_ident (CRToken *a_this, GString * a_ident) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = IDENT_TK ; + + a_this->u.str = a_ident ; + + return CR_OK ; +} + + +enum CRStatus +cr_token_set_function (CRToken *a_this, GString *a_fun_name) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = FUNCTION_TK ; + + a_this->u.str = a_fun_name ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_hash (CRToken *a_this, GString *a_hash) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = HASH_TK ; + + a_this->u.str = a_hash ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_rgb (CRToken *a_this, CRRgb *a_rgb) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = RGB_TK ; + + a_this->u.rgb = a_rgb ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_import_sym (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = IMPORT_SYM_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_page_sym (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = PAGE_SYM_TK ; + + return CR_OK ; +} + + +enum CRStatus +cr_token_set_media_sym (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = MEDIA_SYM_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_font_face_sym (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = FONT_FACE_SYM_TK ; + + return CR_OK ; +} + + +enum CRStatus +cr_token_set_charset_sym (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = CHARSET_SYM_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_atkeyword (CRToken *a_this, GString *a_atname) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = ATKEYWORD_TK ; + + a_this->u.str = a_atname ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_important_sym (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = IMPORTANT_SYM_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_ems (CRToken *a_this, CRNum *a_num) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = EMS_TK ; + + a_this->u.num = a_num ; + + return CR_OK ; +} + + +enum CRStatus +cr_token_set_exs (CRToken *a_this, CRNum *a_num) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = EXS_TK ; + + a_this->u.num = a_num ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_length (CRToken *a_this, CRNum *a_num, + enum CRTokenExtraType a_et) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = LENGTH_TK ; + + a_this->extra_type = a_et ; + a_this->u.num = a_num ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_angle (CRToken *a_this, CRNum *a_num, + enum CRTokenExtraType a_et) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = ANGLE_TK ; + a_this->extra_type = a_et ; + a_this->u.num = a_num ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_time (CRToken *a_this, CRNum *a_num, + enum CRTokenExtraType a_et) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = TIME_TK ; + a_this->extra_type = a_et; + a_this->u.num = a_num ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_freq (CRToken *a_this, CRNum *a_num, + enum CRTokenExtraType a_et) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = FREQ_TK ; + a_this->extra_type = a_et ; + a_this->u.num = a_num ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_dimen (CRToken *a_this, CRNum *a_num, + GString *a_dim) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = DIMEN_TK ; + a_this->u.num = a_num ; + a_this->dimen = a_dim ; + + return CR_OK ; + +} + + +enum CRStatus +cr_token_set_percentage (CRToken *a_this, CRNum *a_num) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = PERCENTAGE_TK ; + a_this->u.num = a_num ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_number (CRToken *a_this, CRNum *a_num) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = NUMBER_TK ; + a_this->u.num = a_num ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_uri (CRToken *a_this, GString *a_uri) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = URI_TK ; + a_this->u.str = a_uri ; + + return CR_OK ; +} + + +enum CRStatus +cr_token_set_delim (CRToken *a_this, guint32 a_char) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = DELIM_TK ; + a_this->u.unichar = a_char ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_semicolon (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = SEMICOLON_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_cbo (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = CBO_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_cbc (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = CBC_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_po (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = PO_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_pc (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = PC_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_bo (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = BO_TK ; + + return CR_OK ; +} + +enum CRStatus +cr_token_set_bc (CRToken *a_this) +{ + g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ; + + cr_token_clear (a_this) ; + + a_this->type = BC_TK ; + + return CR_OK ; +} + + +/** + *The destructor of the #CRToken class. + *@param a_this the current instance of #CRToken. + */ +void +cr_token_destroy (CRToken *a_this) +{ + g_return_if_fail (a_this) ; + + cr_token_clear (a_this) ; + + g_free (a_this) ; +} |