hermet pushed a commit to branch master. http://git.enlightenment.org/tools/enventor.git/commit/?id=921f4b274b01f901b27a3aee84ff0d89bd9eab37
commit 921f4b274b01f901b27a3aee84ff0d89bd9eab37 Author: ChunEon Park <her...@hermet.pe.kr> Date: Wed May 21 10:19:46 2014 +0900 syntax_color - support macro color --- data/color/color.src | 1 + src/bin/syntax_color.c | 118 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 88 insertions(+), 31 deletions(-) diff --git a/data/color/color.src b/data/color/color.src index b7c7581..619bb4e 100644 --- a/data/color/color.src +++ b/data/color/color.src @@ -2,6 +2,7 @@ group "syntax_color_group" struct { value "string" string: "AAAAAA"; value "comment" string: "00B000"; value "define" string: "D42A2A"; + value "macro" string: "D42A2A"; group "colors" array { count 6; group "color" struct { diff --git a/src/bin/syntax_color.c b/src/bin/syntax_color.c index a35e609..8bdc313 100644 --- a/src/bin/syntax_color.c +++ b/src/bin/syntax_color.c @@ -17,9 +17,10 @@ typedef struct color typedef struct syntax_color_group { + char *string; char *comment; char *define; - char *string; + char *macro; color colors[COL_NUM]; } syntax_color_group; @@ -31,7 +32,9 @@ struct syntax_color_s Eina_Stringshare *col_string; Eina_Stringshare *col_comment; Eina_Stringshare *col_define; + Eina_Stringshare *col_macro; Eina_Stringshare *cols[COL_NUM]; + Eina_List *macros; syntax_color_group *scg; Ecore_Thread *thread; @@ -70,6 +73,8 @@ eddc_init() comment, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_scg, syntax_color_group, "define", define, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_scg, syntax_color_group, "macro", + macro, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_color, color, "val", val, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_LIST_STRING(edd_color, color, "keys", keys); @@ -120,6 +125,8 @@ color_table_init(color_data *cd) //free(scg->comment); cd->col_define = eina_stringshare_add(scg->define); //free(scg->define); + cd->col_macro = eina_stringshare_add(scg->macro); + //free(scg->macro); cd->color_hash = eina_hash_string_small_new(hash_free_cb); @@ -154,6 +161,39 @@ color_table_init(color_data *cd) } static void +macro_key_push(color_data *cd, char *key, int len) +{ + //Already registered? + Eina_List *l; + Eina_Stringshare *macro; + EINA_LIST_FOREACH(cd->macros, l, macro) + { + if (strlen(macro) != len) continue; + if (!strcmp(macro, key)) return; + } + + char tmp[2]; + tmp[0] = key[0]; + tmp[1] = '\0'; + + Eina_Inarray *inarray = eina_hash_find(cd->color_hash, tmp); + if (!inarray) + { + inarray = eina_inarray_new(sizeof(color_tuple), 0); + eina_hash_add(cd->color_hash, tmp, inarray); + } + + color_tuple *tuple = malloc(sizeof(color_tuple)); + tuple->col = cd->col_macro; + tuple->key = eina_stringshare_add(key); + eina_inarray_push(inarray, tuple); + + cd->macros = eina_list_append(cd->macros, eina_stringshare_add(tuple->key)); + + free(key); +} + +static void init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED) { color_data *cd = data; @@ -174,6 +214,7 @@ color_init(Eina_Strbuf *strbuf) cd->strbuf = strbuf; cd->cachebuf = eina_strbuf_new(); cd->thread = ecore_thread_run(init_thread_blocking, NULL, NULL, cd); + cd->macros = NULL; return cd; } @@ -189,6 +230,10 @@ color_term(color_data *cd) eina_stringshare_del(cd->col_string); eina_stringshare_del(cd->col_comment); eina_stringshare_del(cd->col_define); + eina_stringshare_del(cd->col_macro); + + Eina_Stringshare *macro; + EINA_LIST_FREE(cd->macros, macro) eina_stringshare_del(macro); int i; for(i = 0; i < COL_NUM; i++) @@ -415,10 +460,25 @@ string_apply(Eina_Strbuf *strbuf, char **cur, char **prev, static int sharp_apply(Eina_Strbuf *strbuf, const char **src, int length, char **cur, - char **prev, const Eina_Stringshare *color) + char **prev, const Eina_Stringshare *color, + const Eina_Stringshare *color2, color_data *cd) { if ((*cur)[0] != '#') return 0; + char *space = strstr(*cur, " "); + const char *eol = strstr(*cur, EOL); + + if (!eol) eol = (*src) + length; + if (!space) space = (char *) eol; + + //Let's find start of the macro name + while ((*space == ' ') && (space != eol)) space++; + + //Let's find the macro name + char *macro_begin = space; + char *macro_end = strstr(space, " "); + + //#define, #ifdef, #if, #... eina_strbuf_append_length(strbuf, *prev, (*cur - *prev)); char buf[128]; @@ -428,43 +488,38 @@ sharp_apply(Eina_Strbuf *strbuf, const char **src, int length, char **cur, int cmp_size = 1; //strlen("#"); *cur += cmp_size; - if (*cur > (*src + length)) - { - eina_strbuf_append(strbuf, "</color>"); - return -1; - } - *prev = *cur; + *cur = space; - char *space = strstr(*prev, " "); - char *eol = strstr(*prev, EOL); - - if (space < eol) - { - *cur = space; - cmp_size = 1; //strlen(" "); - } - else - { - *cur = eol; - cmp_size = EOL_LEN; - } + eina_strbuf_append_length(strbuf, *prev, (*cur - *prev)); + eina_strbuf_append(strbuf, "</color>"); - if (*cur) + if ((!macro_end) || (macro_end >= eol)) { - eina_strbuf_append_length(strbuf, *prev, (*cur - *prev)); - if (space < eol) eina_strbuf_append(strbuf, "</color> "); - else eina_strbuf_append(strbuf, "</color><br/>"); - *cur += cmp_size; - *prev = *cur; - return 1; + *prev = *cur; + return 1; } - eina_strbuf_append(strbuf, *prev); + //macro name *prev = *cur; + *cur = macro_end; + snprintf(buf, sizeof(buf), "<color=#%s>", color); + eina_strbuf_append(strbuf, buf); + eina_strbuf_append_length(strbuf, *prev, (*cur - *prev)); eina_strbuf_append(strbuf, "</color>"); - return -1; + + macro_key_push(cd, strndup(*prev, *cur - *prev), *cur - *prev); + + *prev = *cur; + + return 1; + +nospace: + (*cur)++; + eina_strbuf_append_length(strbuf, *prev, (*cur - *prev)); + *prev = *cur; + return 1; } const char * @@ -599,7 +654,8 @@ color_apply(color_data *cd, const char *src, int length) if (ret == 1) continue; //handle comment: # - ret = sharp_apply(strbuf, &src, length, &cur, &prev, cd->col_define); + ret = sharp_apply(strbuf, &src, length, &cur, &prev, cd->col_define, + cd->col_macro, cd); if (ret == 1) continue; else if (ret == -1) goto finished; --