summaryrefslogtreecommitdiff
path: root/src/cr-tknzr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cr-tknzr.c')
-rw-r--r--src/cr-tknzr.c172
1 files changed, 72 insertions, 100 deletions
diff --git a/src/cr-tknzr.c b/src/cr-tknzr.c
index 859b6c5..64924ed 100644
--- a/src/cr-tknzr.c
+++ b/src/cr-tknzr.c
@@ -195,7 +195,7 @@ CHECK_PARSING_STATUS (status, TRUE) ;
*/
#define SKIP_CHARS(a_tknzr, a_nb_chars) \
{ \
-gulong nb_chars = a_nb_chars ; \
+glong nb_chars = a_nb_chars ; \
status = cr_input_consume_chars \
(PRIVATE (a_tknzr)->input,0, &nb_chars) ; \
CHECK_PARSING_STATUS (status, TRUE) ; \
@@ -408,7 +408,7 @@ cr_tknzr_try_to_skip_spaces (CRTknzr * a_this)
}
if (cr_utils_is_white_space (cur_char) == TRUE) {
- gulong nb_chars = -1; /*consume all spaces */
+ glong nb_chars = -1; /*consume all spaces */
status = cr_input_consume_white_spaces
(PRIVATE (a_this)->input, &nb_chars);
@@ -434,7 +434,7 @@ cr_tknzr_parse_comment (CRTknzr * a_this,
CRInputPos init_pos;
guint32 cur_char = 0, next_char= 0;
CRString *comment = NULL;
- CRParsingLocation loc = {0,0,0} ;
+ CRParsingLocation loc = {0} ;
g_return_val_if_fail (a_this && PRIVATE (a_this)
&& PRIVATE (a_this)->input,
@@ -448,38 +448,49 @@ cr_tknzr_parse_comment (CRTknzr * a_this,
READ_NEXT_CHAR (a_this, &cur_char);
ENSURE_PARSING_COND (cur_char == '*');
comment = cr_string_new ();
- for (;;) {
+ for (;;) { /* [^*]* */
+ PEEK_NEXT_CHAR (a_this, &next_char);
+ if (next_char == '*')
+ break;
READ_NEXT_CHAR (a_this, &cur_char);
-
- /*make sure there are no nested comments */
- if (cur_char == '/') {
+ g_string_append_unichar (comment->stryng, cur_char);
+ }
+ /* Stop condition: next_char == '*' */
+ for (;;) { /* \*+ */
+ READ_NEXT_CHAR(a_this, &cur_char);
+ ENSURE_PARSING_COND (cur_char == '*');
+ g_string_append_unichar (comment->stryng, cur_char);
+ PEEK_NEXT_CHAR (a_this, &next_char);
+ if (next_char != '*')
+ break;
+ }
+ /* Stop condition: next_char != '*' */
+ for (;;) { /* ([^/][^*]*\*+)* */
+ if (next_char == '/')
+ break;
+ READ_NEXT_CHAR(a_this, &cur_char);
+ g_string_append_unichar (comment->stryng, cur_char);
+ for (;;) { /* [^*]* */
+ PEEK_NEXT_CHAR (a_this, &next_char);
+ if (next_char == '*')
+ break;
READ_NEXT_CHAR (a_this, &cur_char);
- ENSURE_PARSING_COND (cur_char != '*');
- g_string_append_c (comment->stryng, '/');
- g_string_append_unichar (comment->stryng,
- cur_char);
- continue;
+ g_string_append_unichar (comment->stryng, cur_char);
}
-
- /*Detect the end of the comments region */
- if (cur_char == '*') {
+ /* Stop condition: next_char = '*', no need to verify, because peek and read exit to error anyway */
+ for (;;) { /* \*+ */
+ READ_NEXT_CHAR(a_this, &cur_char);
+ ENSURE_PARSING_COND (cur_char == '*');
+ g_string_append_unichar (comment->stryng, cur_char);
PEEK_NEXT_CHAR (a_this, &next_char);
-
- if (next_char == '/') {
- /*
- *end of comments region
- *Now, call the right SAC callback.
- */
- SKIP_CHARS (a_this, 1) ;
- status = CR_OK;
+ if (next_char != '*')
break;
- } else {
- g_string_append_c (comment->stryng,
- '*');
- }
}
- g_string_append_unichar (comment->stryng, cur_char);
+ /* Continue condition: next_char != '*' */
}
+ /* Stop condition: next_char == '\/' */
+ READ_NEXT_CHAR(a_this, &cur_char);
+ g_string_append_unichar (comment->stryng, cur_char);
if (status == CR_OK) {
cr_parsing_location_copy (&comment->location,
@@ -562,39 +573,16 @@ cr_tknzr_parse_unicode_escape (CRTknzr * a_this,
cur_char_val = 10 + (cur_char - 'A');
}
- unicode = unicode * 10 + cur_char_val;
+ unicode = unicode * 16 + cur_char_val;
PEEK_NEXT_CHAR (a_this, &cur_char);
}
- if (occur == 5) {
- /*
- *the unicode escape is 6 digit length
- */
-
- /*
- *parse one space that may
- *appear just after the unicode
- *escape.
- */
- cr_tknzr_parse_w (a_this, &tmp_char_ptr1,
- &tmp_char_ptr2, NULL);
- status = CR_OK;
- } else {
- /*
- *The unicode escape is less than
- *6 digit length. The character
- *that comes right after the escape
- *must be a white space.
- */
- status = cr_tknzr_parse_w (a_this, &tmp_char_ptr1,
- &tmp_char_ptr2, NULL);
- }
-
- if (status == CR_OK) {
- *a_unicode = unicode;
- return CR_OK;
- }
+ /* Eat a whitespace if possible. */
+ cr_tknzr_parse_w (a_this, &tmp_char_ptr1,
+ &tmp_char_ptr2, NULL);
+ *a_unicode = unicode;
+ return CR_OK;
error:
/*
@@ -711,14 +699,13 @@ cr_tknzr_parse_string (CRTknzr * a_this, CRString ** a_str)
guchar next_chars[2] = { 0 };
PEEK_BYTE (a_this, 1, &next_chars[0]);
+ PEEK_BYTE (a_this, 2, &next_chars[1]);
if (next_chars[0] == '\\') {
guchar *tmp_char_ptr1 = NULL,
*tmp_char_ptr2 = NULL;
guint32 esc_code = 0;
- PEEK_BYTE (a_this, 2, &next_chars[1]);
-
if (next_chars[1] == '\'' || next_chars[1] == '"') {
g_string_append_unichar (str->stryng,
next_chars[1]);
@@ -1036,7 +1023,7 @@ cr_tknzr_parse_name (CRTknzr * a_this,
gboolean str_needs_free = FALSE,
is_first_nmchar=TRUE ;
glong i = 0;
- CRParsingLocation loc = {0,0,0} ;
+ CRParsingLocation loc = {0} ;
g_return_val_if_fail (a_this && PRIVATE (a_this)
&& PRIVATE (a_this)->input
@@ -1088,7 +1075,7 @@ cr_tknzr_parse_hash (CRTknzr * a_this, CRString ** a_str)
CRInputPos init_pos;
enum CRStatus status = CR_OK;
gboolean str_needs_free = FALSE;
- CRParsingLocation loc = {0,0,0} ;
+ CRParsingLocation loc = {0} ;
g_return_val_if_fail (a_this && PRIVATE (a_this)
&& PRIVATE (a_this)->input,
@@ -1141,7 +1128,7 @@ cr_tknzr_parse_uri (CRTknzr * a_this,
enum CRStatus status = CR_PARSING_ERROR;
guchar tab[4] = { 0 }, *tmp_ptr1 = NULL, *tmp_ptr2 = NULL;
CRString *str = NULL;
- CRParsingLocation location = {0,0,0} ;
+ CRParsingLocation location = {0} ;
g_return_val_if_fail (a_this
&& PRIVATE (a_this)
@@ -1266,7 +1253,7 @@ cr_tknzr_parse_rgb (CRTknzr * a_this, CRRgb ** a_rgb)
blue = 0,
i = 0;
gboolean is_percentage = FALSE;
- CRParsingLocation location = {0,0,0} ;
+ CRParsingLocation location = {0} ;
g_return_val_if_fail (a_this && PRIVATE (a_this), CR_BAD_PARAM_ERROR);
@@ -1293,7 +1280,7 @@ cr_tknzr_parse_rgb (CRTknzr * a_this, CRRgb ** a_rgb)
status = cr_tknzr_parse_num (a_this, &num);
ENSURE_PARSING_COND ((status == CR_OK) && (num != NULL));
- red = (glong)num->val;
+ red = num->val;
cr_num_destroy (num);
num = NULL;
@@ -1319,9 +1306,9 @@ cr_tknzr_parse_rgb (CRTknzr * a_this, CRRgb ** a_rgb)
}
if (i == 0) {
- green = (glong)num->val;
+ green = num->val;
} else if (i == 1) {
- blue = (glong)num->val;
+ blue = num->val;
}
if (num) {
@@ -1492,7 +1479,7 @@ cr_tknzr_parse_num (CRTknzr * a_this,
next_char = 0;
gdouble numerator, denominator = 1;
CRInputPos init_pos;
- CRParsingLocation location = {0,0,0} ;
+ CRParsingLocation location = {0} ;
g_return_val_if_fail (a_this && PRIVATE (a_this)
&& PRIVATE (a_this)->input,
@@ -1583,7 +1570,9 @@ cr_tknzr_parse_num (CRTknzr * a_this,
CRTknzr *
cr_tknzr_new (CRInput * a_input)
{
- CRTknzr *result = (CRTknzr *)g_try_malloc (sizeof (CRTknzr));
+ CRTknzr *result = NULL;
+
+ result = g_try_malloc (sizeof (CRTknzr));
if (result == NULL) {
cr_utils_trace_info ("Out of memory");
@@ -1592,7 +1581,7 @@ cr_tknzr_new (CRInput * a_input)
memset (result, 0, sizeof (CRTknzr));
- result->priv = (CRTknzrPriv *)g_try_malloc (sizeof (CRTknzrPriv));
+ result->priv = g_try_malloc (sizeof (CRTknzrPriv));
if (result->priv == NULL) {
cr_utils_trace_info ("Out of memory");
@@ -1633,7 +1622,9 @@ cr_tknzr_new_from_uri (const guchar * a_file_uri,
enum CREncoding a_enc)
{
CRTknzr *result = NULL;
- CRInput *input = cr_input_new_from_uri ((gchar *)a_file_uri, a_enc);
+ CRInput *input = NULL;
+
+ input = cr_input_new_from_uri (a_file_uri, a_enc);
g_return_val_if_fail (input != NULL, NULL);
result = cr_tknzr_new (input);
@@ -1906,7 +1897,7 @@ cr_tknzr_consume_chars (CRTknzr * a_this, guint32 a_char, glong * a_nb_char)
}
return cr_input_consume_chars (PRIVATE (a_this)->input,
- a_char, (gulong *)a_nb_char);
+ a_char, a_nb_char);
}
enum CRStatus
@@ -1958,7 +1949,7 @@ cr_tknzr_get_next_token (CRTknzr * a_this, CRToken ** a_tk)
CRInput *input = NULL;
CRString *str = NULL;
CRRgb *rgb = NULL;
- CRParsingLocation location = {0,0,0} ;
+ CRParsingLocation location = {0} ;
g_return_val_if_fail (a_this && PRIVATE (a_this)
&& a_tk && *a_tk == NULL
@@ -2106,18 +2097,8 @@ cr_tknzr_get_next_token (CRTknzr * a_this, CRToken ** a_tk)
}
goto done;
}
- } else {
- status = cr_tknzr_parse_ident (a_this, &str);
- if (status == CR_OK && str) {
- status = cr_token_set_ident (token, str);
- CHECK_PARSING_STATUS (status, TRUE);
- if (str) {
- cr_parsing_location_copy (&token->location,
- &str->location) ;
- }
- goto done;
- }
- }
+ }
+ goto fallback;
break;
case 'r':
@@ -2136,28 +2117,18 @@ cr_tknzr_get_next_token (CRTknzr * a_this, CRToken ** a_tk)
goto done;
}
- } else {
- status = cr_tknzr_parse_ident (a_this, &str);
- if (status == CR_OK) {
- status = cr_token_set_ident (token, str);
- CHECK_PARSING_STATUS (status, TRUE);
- if (str) {
- cr_parsing_location_copy (&token->location,
- &str->location) ;
- }
- str = NULL;
- goto done;
- }
}
+ goto fallback;
break;
case '<':
- if (BYTE (input, 2, NULL) == '-'
- && BYTE (input, 3, NULL) == '-') {
+ if (BYTE (input, 2, NULL) == '!'
+ && BYTE (input, 3, NULL) == '-'
+ && BYTE (input, 4, NULL) == '-') {
SKIP_CHARS (a_this, 1);
cr_tknzr_get_parsing_location (a_this,
&location) ;
- SKIP_CHARS (a_this, 2);
+ SKIP_CHARS (a_this, 3);
status = cr_token_set_cdo (token);
CHECK_PARSING_STATUS (status, TRUE);
cr_parsing_location_copy (&token->location,
@@ -2390,7 +2361,7 @@ cr_tknzr_get_next_token (CRTknzr * a_this, CRToken ** a_tk)
next_bytes[0] = BYTE (input, 1, NULL);
next_bytes[1] = BYTE (input, 2, NULL);
next_bytes[2] = BYTE (input, 3, NULL);
- next_bytes[3] = BYTE (input, 4, NULL);
+ next_bytes[3] = BYTE (input, 3, NULL);
if (next_bytes[0] == 'e'
&& next_bytes[1] == 'm') {
@@ -2538,6 +2509,7 @@ cr_tknzr_get_next_token (CRTknzr * a_this, CRToken ** a_tk)
break;
default:
+ fallback:
/*process the fallback cases here */
if (next_char == '\\'