7
#define MESSAGE_OVERRIDE
9
typedef struct _Code_Symbol
15
Eina_Bool is_public : 1;
20
TOKEN_TYPE_INVALID = -1,
22
TOKEN_TYPE_COLON = (1 << 0),
23
TOKEN_TYPE_SEMICOLON = (1 << 1),
24
TOKEN_TYPE_COMMA = (1 << 2),
25
TOKEN_TYPE_PARENS = (1 << 3),
26
TOKEN_TYPE_BRACES = (1 << 4),
27
TOKEN_TYPE_EQUAL_MARK = (1 << 5),
28
TOKEN_TYPE_PUBLIC = (1 << 6),
29
TOKEN_TYPE_IDENTIFIER = (1 << 7)
38
static void code_parse_internal(Code *code);
39
static Token *next_token(char **begin, char *end);
44
Edje_Part_Collection_Parser *pcp;
49
if (code->is_lua || code->parsed) return;
51
id = eina_list_data_idx(codes, code);
52
pcp = eina_list_nth(edje_collections, id);
54
EINA_LIST_FOREACH(pcp->base_codes, l, base)
58
code_parse_internal(code);
60
code->parsed = EINA_TRUE;
64
code_parse_internal(Code *code)
66
Code_Symbol *sym = NULL, *func = NULL;
67
Token *token, *tmp = NULL;
68
char *begin = code->shared;
69
char *end = begin + strlen(begin);
71
Eina_Array *name_stack;
72
Eina_Bool is_args = EINA_FALSE;
73
Eina_Bool is_public = EINA_FALSE;
76
name_stack = eina_array_new(4);
78
while ((token = next_token(&begin, end)))
80
if (token->type == TOKEN_TYPE_EOF)
85
if (token->type == TOKEN_TYPE_EQUAL_MARK)
87
while ((tmp = next_token(&begin, end)))
89
if ((tmp->type == TOKEN_TYPE_COMMA) ||
90
(tmp->type == TOKEN_TYPE_SEMICOLON))
92
if (token->str) free(token->str);
100
if (tmp->str) free(tmp->str);
107
case TOKEN_TYPE_COLON:
109
sym = mem_alloc(SZ(Code_Symbol));
110
sym->tag = eina_array_pop(name_stack);
113
case TOKEN_TYPE_SEMICOLON:
114
if (eina_array_count(name_stack))
117
sym = mem_alloc(SZ(Code_Symbol));
118
sym->name = eina_array_pop(name_stack);
119
sym->is_public = is_public;
120
code->vars = eina_list_append(code->vars, sym);
123
is_public = EINA_FALSE;
126
case TOKEN_TYPE_COMMA:
128
sym = mem_alloc(SZ(Code_Symbol));
129
sym->name = eina_array_pop(name_stack);
131
func->args = eina_list_append(func->args, sym);
134
sym->is_public = is_public;
135
code->vars = eina_list_append(code->vars, sym);
140
case TOKEN_TYPE_PARENS:
145
func = mem_alloc(SZ(Code_Symbol));
151
func->name = eina_array_pop(name_stack);
155
if (eina_array_count(name_stack))
158
sym = mem_alloc(SZ(Code_Symbol));
159
sym->name = eina_array_pop(name_stack);
160
func->args = eina_list_append(func->args, sym);
166
case TOKEN_TYPE_BRACES:
169
while ((tmp = next_token(&begin, end)))
171
if (tmp->type == TOKEN_TYPE_BRACES)
187
if (tmp->str) free(tmp->str);
191
if ((begin - 1) > body)
193
sym->body = mem_alloc(sizeof(char) * (begin - body - 1));
194
strncpy(sym->body, body, (begin - body - 2));
196
sym->is_public = is_public;
197
code->func = eina_list_append(code->func, sym);
199
is_public = EINA_FALSE;
202
case TOKEN_TYPE_PUBLIC:
203
is_public = EINA_TRUE;
206
case TOKEN_TYPE_IDENTIFIER:
207
eina_array_push(name_stack, token->str);
221
if (tmp->str) free(tmp->str);
234
eina_array_free(name_stack);
238
next_token(char **begin, char *end)
240
char buf[PATH_MAX] = { 0, };
244
Eina_Bool parsed = EINA_FALSE;
246
if (!begin || (*begin >= end))
249
token = mem_alloc(SZ(Token));
250
token->type = TOKEN_TYPE_INVALID;
295
token->type = TOKEN_TYPE_COLON;
299
token->type = TOKEN_TYPE_SEMICOLON;
303
token->type = TOKEN_TYPE_COMMA;
308
token->type = TOKEN_TYPE_PARENS;
313
token->type = TOKEN_TYPE_BRACES;
317
token->type = TOKEN_TYPE_EQUAL_MARK;
321
token->type = TOKEN_TYPE_EOF;
327
if (!strcmp(buf, "public"))
328
token->type = TOKEN_TYPE_PUBLIC;
330
token->type = TOKEN_TYPE_IDENTIFIER;
334
token->str = strdup(buf);
339
_push_symbol(Eina_List **total, Code_Symbol *sym, Edje_Part_Collection *pc)
346
EINA_LIST_FOREACH(list, l, sym2)
348
if (!strcmp(sym2->name, sym->name))
350
WRN("Symbols in group \"%s\" have same name \"%s\". Latter defined "
351
"will shadow former one.", pc->part, sym->name);
352
list = eina_list_remove(list, sym2);
356
list = eina_list_append(list, sym);
361
script_rewrite(Code *code)
363
Edje_Part_Collection *pc;
364
Edje_Part_Collection_Parser *pcp;
369
Eina_List *vars = NULL;
370
Eina_List *func = NULL;
371
#ifdef MESSAGE_OVERRIDE
372
Eina_List *message = NULL;
374
Code_Symbol *sym, *arg;
378
id = eina_list_data_idx(codes, code);
379
pc = eina_list_nth(edje_collections, id);
380
pcp = (Edje_Part_Collection_Parser *)pc;
382
EINA_LIST_FOREACH(pcp->base_codes, l, base)
384
EINA_LIST_FOREACH(base->vars, ll, sym)
385
_push_symbol(&vars, sym, pc);
387
EINA_LIST_FOREACH(base->func, ll, sym)
389
#ifndef MESSAGE_OVERRIDE
390
_push_symbol(&func, sym, pc);
392
if (strcmp(sym->name, "message"))
393
_push_symbol(&func, sym, pc);
395
message = eina_list_append(message, sym);
400
EINA_LIST_FOREACH(code->vars, l, sym)
401
_push_symbol(&vars, sym, pc);
402
EINA_LIST_FOREACH(code->func, l, sym)
404
#ifndef MESSAGE_OVERRIDE
405
_push_symbol(&func, sym, pc);
407
if (strcmp(sym->name, "message"))
408
_push_symbol(&func, sym, pc);
410
message = eina_list_append(message, sym);
414
buf = eina_strbuf_new();
419
EINA_LIST_FOREACH(vars, l, sym)
421
if (!sym->is_public) continue;
424
eina_strbuf_append(buf, ", ");
426
eina_strbuf_append(buf, "public ");
429
eina_strbuf_append_printf(buf, "%s:", sym->tag);
430
eina_strbuf_append(buf, sym->name);
433
eina_strbuf_append(buf, ";\n");
438
EINA_LIST_FOREACH(func, l, sym)
440
eina_strbuf_append(buf, "\n");
442
eina_strbuf_append(buf, "public ");
445
eina_strbuf_append_printf(buf, "%s:", sym->tag);
446
eina_strbuf_append_printf(buf, "%s(", sym->name);
449
EINA_LIST_FOREACH(sym->args, ll, arg)
452
eina_strbuf_append(buf, ", ");
455
eina_strbuf_append_printf(buf, "%s:", arg->tag);
456
eina_strbuf_append(buf, arg->name);
458
eina_strbuf_append(buf, ") {");
461
eina_strbuf_append(buf, sym->body);
462
eina_strbuf_rtrim(buf);
464
eina_strbuf_append(buf, "\n}\n");
468
#ifdef MESSAGE_OVERRIDE
471
eina_strbuf_append(buf, "\npublic message(Msg_Type:type, id, ...) {");
472
EINA_LIST_FOREACH(message, l, sym)
474
eina_strbuf_append(buf, sym->body);
475
eina_strbuf_rtrim(buf);
476
eina_strbuf_append(buf, "\n");
478
eina_strbuf_append(buf, "}\n");
482
code->shared = eina_strbuf_string_steal(buf);
483
code->original = strdup(code->shared);
484
eina_strbuf_free(buf);
486
eina_list_free(code->vars);
487
eina_list_free(code->func);