diff options
Diffstat (limited to 'src/bin/edje/edje_cc_script.c')
-rw-r--r-- | src/bin/edje/edje_cc_script.c | 129 |
1 files changed, 85 insertions, 44 deletions
diff --git a/src/bin/edje/edje_cc_script.c b/src/bin/edje/edje_cc_script.c index dca9fef953..2e52ac1c2f 100644 --- a/src/bin/edje/edje_cc_script.c +++ b/src/bin/edje/edje_cc_script.c @@ -19,19 +19,19 @@ typedef enum { TOKEN_TYPE_INVALID = -1, TOKEN_TYPE_EOF, - TOKEN_TYPE_COLON = (1 << 0), - TOKEN_TYPE_SEMICOLON = (1 << 1), - TOKEN_TYPE_COMMA = (1 << 2), - TOKEN_TYPE_PARENS = (1 << 3), - TOKEN_TYPE_BRACES = (1 << 4), + TOKEN_TYPE_COLON = (1 << 0), + TOKEN_TYPE_SEMICOLON = (1 << 1), + TOKEN_TYPE_COMMA = (1 << 2), + TOKEN_TYPE_PARENS = (1 << 3), + TOKEN_TYPE_BRACES = (1 << 4), TOKEN_TYPE_EQUAL_MARK = (1 << 5), - TOKEN_TYPE_PUBLIC = (1 << 6), + TOKEN_TYPE_PUBLIC = (1 << 6), TOKEN_TYPE_IDENTIFIER = (1 << 7) } Token_Type; typedef struct _Token { - char *str; + char *str; Token_Type type; } Token; @@ -64,7 +64,7 @@ static void code_parse_internal(Code *code) { Code_Symbol *sym = NULL, *func = NULL; - Token *token, *tmp; + Token *token, *tmp = NULL; char *begin = code->shared; char *end = begin + strlen(begin); char *body; @@ -89,9 +89,16 @@ code_parse_internal(Code *code) if ((tmp->type == TOKEN_TYPE_COMMA) || (tmp->type == TOKEN_TYPE_SEMICOLON)) { + if (token->str) free(token->str); + free(token); + token = tmp; + tmp = NULL; break; } + + if (tmp->str) free(tmp->str); + free(tmp); } } @@ -102,6 +109,7 @@ code_parse_internal(Code *code) sym = mem_alloc(SZ(Code_Symbol)); sym->tag = eina_array_pop(name_stack); break; + case TOKEN_TYPE_SEMICOLON: if (eina_array_count(name_stack)) { @@ -114,6 +122,7 @@ code_parse_internal(Code *code) } is_public = EINA_FALSE; break; + case TOKEN_TYPE_COMMA: if (!sym) sym = mem_alloc(SZ(Code_Symbol)); @@ -127,6 +136,7 @@ code_parse_internal(Code *code) } sym = NULL; break; + case TOKEN_TYPE_PARENS: is_args = !is_args; if (is_args) @@ -152,6 +162,7 @@ code_parse_internal(Code *code) sym = func; } break; + case TOKEN_TYPE_BRACES: depth = 1; body = begin; @@ -164,6 +175,7 @@ code_parse_internal(Code *code) case '{': depth++; break; + case '}': depth--; break; @@ -171,6 +183,9 @@ code_parse_internal(Code *code) } if (!depth) break; + + if (tmp->str) free(tmp->str); + free(tmp); } if ((begin - 1) > body) { @@ -182,13 +197,16 @@ code_parse_internal(Code *code) sym = NULL; is_public = EINA_FALSE; break; + case TOKEN_TYPE_PUBLIC: is_public = EINA_TRUE; break; + case TOKEN_TYPE_IDENTIFIER: eina_array_push(name_stack, token->str); token->str = NULL; break; + default: break; } @@ -196,6 +214,20 @@ code_parse_internal(Code *code) if (token->str) free(token->str); free(token); + + if (tmp) + { + if (tmp->str) free(tmp->str); + free(tmp); + tmp = NULL; + } + } + + if (token) + { + if (token->str) + free(token->str); + free(token); } eina_array_free(name_stack); @@ -228,9 +260,10 @@ next_token(char **begin, char *end) case ' ': case '\t': case '\n': - if (index > 0) - parsed = EINA_TRUE; - break; + if (index > 0) + parsed = EINA_TRUE; + break; + case ':': case ';': case ',': @@ -239,46 +272,53 @@ next_token(char **begin, char *end) case '{': case '}': case '=': - if (!index) - { - buf[index++] = ch; - src++; - } - goto exit; + if (!index) + { + buf[index++] = ch; + src++; + } + goto exit; + default: - if (parsed) - goto exit; - buf[index++] = ch; - break; + if (parsed) + goto exit; + buf[index++] = ch; + break; } } exit: switch (buf[0]) { - case ':': - token->type = TOKEN_TYPE_COLON; - break; - case ';': - token->type = TOKEN_TYPE_SEMICOLON; - break; - case ',': - token->type = TOKEN_TYPE_COMMA; - break; - case '(': - case ')': - token->type = TOKEN_TYPE_PARENS; - break; - case '{': - case '}': - token->type = TOKEN_TYPE_BRACES; - break; - case '=': - token->type = TOKEN_TYPE_EQUAL_MARK; - break; - case '\0': - token->type = TOKEN_TYPE_EOF; - break; + case ':': + token->type = TOKEN_TYPE_COLON; + break; + + case ';': + token->type = TOKEN_TYPE_SEMICOLON; + break; + + case ',': + token->type = TOKEN_TYPE_COMMA; + break; + + case '(': + case ')': + token->type = TOKEN_TYPE_PARENS; + break; + + case '{': + case '}': + token->type = TOKEN_TYPE_BRACES; + break; + + case '=': + token->type = TOKEN_TYPE_EQUAL_MARK; + break; + + case '\0': + token->type = TOKEN_TYPE_EOF; + break; } if (token->type < 0) @@ -448,3 +488,4 @@ script_rewrite(Code *code) code->vars = vars; code->func = func; } + |